如何判断一段程序是由C++编译还是C编译-程序员宅基地

(1)如果是要你的代码在编译时就发现编译器类型,就判断_cplusplus或_STDC_宏,如果是一个C文件被编译,那么_STDC_就会被定义,_STDC_是预定义宏,当它被定义后,编译器将按照ANSIC标准来编译C语言程序。通常许多编译器还有其他编译标志宏。

#ifdef __cplusplus

       cout<<"c++";

#else

       cout<<"c";

#endif

或者

#include<stdio.h>
 
#ifdef _cplusplus
#define USING_C 0
#else
#define USING_C 1
#endif
 
#include<stdio.h>
int main()
{
      if(USING_C)
            printf("C\n");
      else 
            printf("C++\n");
      return 0;

(2)如果要判断已经编译过的代码的编译类型,就查一下输出函数符号是否和函数名相同。(相同为c,不同为c++,因为C没有函数重载的概念,C++里有函数重载,所以为了避免编译后函数符号相同,C++里编译后,函数符号为参数类型加函数名组成的)

另外,需要注意的是,如果在C++编译器里使用通过C编译的目标文件,需要通知C++编译器,用extern关键字:

介绍下extern关键字:

extern一般变量或函数前,用于表明变量或函数的定义在别的文件中,提示编译器若遇到此变量和函数时,在其他模块中寻找其定义
主要有两个作用:
(1)与“C”一起连用的时候,如
 

extern "C" 
{
    void func(int a,int b);
}

告诉编译器对此函数的编译按照C的格式,C++编译后会生成函数名加参数的类型,而C只有函数名。

(2)当extern不与“C”在一起用,而只修饰变量或函数时,如extern int g_Int;

它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块或其他模块中使用。记住它是一个声明不是定义!也就是说B模块(即编译单元)要是引用模块A中定义的全局变量或函数时,它只要包含A模块的头文件即可,在编译阶段,模块B虽然找不到该函数或变量,但它不会报错,它会在连接时从模块A生成的目标代码中找到此函数。

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ddllrrbb/article/details/88811801

智能推荐

opencv:Load Caffe framework models_opencv例子里的dictnet_vgg.caffemodel怎么下载-程序员宅基地

文章浏览阅读1.6k次。这个是怎么编译扩展包的呢?首先在here下载两个包:opencv_contrib和opencv ,然后按照正常的方法把opencv编译好:这里的opencv必须要这个链接的版本,我试了一下自己的版本是不可以编译的。[cpp] view plain copy cd opencv mkdir build cd _opencv例子里的dictnet_vgg.caffemodel怎么下载

中断的分类和区别_中断分类-程序员宅基地

文章浏览阅读3w次,点赞20次,收藏114次。中断这里简要的介绍下中断的分类。内核与硬件通信的方式:轮询和中断。轮询速度太慢,中断被大量采用。从不同的角度来说,中断可以有三种分类方法。中断可以分为同步中断(synchronous)和异步中断(asynchronous)。中断可分为硬中断和软中断。中断可分为可屏蔽中断(Maskable interrupt)和非屏蔽中断(Nomaskable interrupt)。同步中断是..._中断分类

java计算机毕业设计后勤管理系统源码+mysql数据库+系统+lw文档+部署-程序员宅基地

文章浏览阅读87次。java计算机毕业设计后勤管理系统源码+mysql数据库+系统+lw文档+部署。springboot基于精细化考核的离散数学课程教学目标达成系统。JSP企业客户服务与产品管理系统的设计和实现SQLServer。springboot基于Springboot的测试项目管理平台。springcloud基于微服务架构的乐居租房网的设计与实现。springboot垂钓分享交流网的设计与实现。ssm基于SSM框架的在线健康系统设计与实现。ssm基于SSM框架的毕业生离校管理系统。

m基于FPGA的FOC控制器verilog实现,包含testbench_verilog 电机foc控制-程序员宅基地

文章浏览阅读1.8k次。而平行于转子磁轴方向的电流分量,所产生的磁场与转子磁场一致,就不会产生任何的力矩。另外,一个好的控制算法就需要使这个平行于转子磁轴方向的电流分量尽量最小化,因为,这个电流分量只会使电机产生多余的热量,并加剧轴承的磨损。由此而得到的电机力矩和这个电流分量的大小成比例。又因为磁场的大小与方向与电流的大小与方向有着直接的关系,所以在用FOC控制算法控制BLDC时的关键就是控制三相输入的电流大小与方向。而控制电流产生定子磁场与转子磁场垂直的关键在:控制稳定的三相输入电压及其电流向量,并且我们得知道转子的实时位置。_verilog 电机foc控制

MyBatis新增数据时自增id的两种写法_mybatis id自增-程序员宅基地

文章浏览阅读6.2k次,点赞4次,收藏5次。MyBatis新增数据时自增id的两种写法_mybatis id自增

编译原理之消除算术表达式文法的左递归_编译原理算数表达式怎么消除左递归-程序员宅基地

文章浏览阅读2.7k次,点赞4次,收藏4次。编译原理之消除算术表达式文法的左递归_编译原理算数表达式怎么消除左递归

随便推点

ipython和pycharm的区别_python与pycharm有何区别-程序员宅基地

文章浏览阅读2k次。Python是一种计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。PyCharm 是 Python 的专用 IDE,地位类似于 Java 的 IDE Eclipse。功能齐全的集成开发环境同时提供收费版和免费版,即专业版和社区版。PyCharm 是安装最快的 IDE,且安装后的..._ipython和pycharm的区别

iOS Boilerplate: 快速启动你的iOS应用开发-程序员宅基地

文章浏览阅读340次,点赞9次,收藏9次。iOS Boilerplate: 快速启动你的iOS应用开发iOS Boilerplate 是一个用于快速创建iOS应用的模板项目。它包含了各种常见的功能和最佳实践,能够帮助开发者节省时间,并确保代码质量。项目简介iOS Boilerplate 旨在为新项目的开始提供一个稳定、可扩展的基础。该项目基于 Swift 5.0 和 Xcode 12 开发,遵循 MVVM 设计模式,并集成了多个常用...

PHP运算符汇总_php中输出运算符-程序员宅基地

文章浏览阅读1k次,点赞23次,收藏18次。PHP运算符汇总_php中输出运算符

组态王与FX5u之间EtherNet/IP无线以太网通信_fx5-enet/ip tcp 通讯-程序员宅基地

文章浏览阅读835次。本方案以组态王和2台三菱FX5u PLC为例,介绍组态王与多台 PLC的无线以太网通信实现过程。_fx5-enet/ip tcp 通讯

python建立软连接_#!/usr/bin/env python和#!/usr/bin/python的区别 python3的软连接没有生效...-程序员宅基地

文章浏览阅读1.8k次。之后就能正常执行了。ln -s /usr/local/python/bin/python3 /usr/bin/python重新配置软连接原因是配置python3的环境时,中途又编译安装了python3,导致前面设置的软连接失效不知为何,python3的软连接没有生效于是打开python,发现python运行的版本是python2.7.5改成/usr/bin/python 也不行开始以为是/usr/..._python软连接失效

ssh 远程shell脚本_如何使用SSH在远程上运行Shell脚本或命令-程序员宅基地

文章浏览阅读2.6k次。ssh 远程shell脚本I want to run my commands securely. Is there any way for this? Yes, there are a lot of options. But the most simple and secure way is running scripts or commands over ssh.我想安全地运行命令。 有什么办..._ssh remote shell

推荐文章

热门文章

相关标签