如何判断一段程序是由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生成的目标代码中找到此函数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值