(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生成的目标代码中找到此函数。