问答题 如何判断一段程序是由C编译程序还是由C++编译程序编译的
【正确答案】
【答案解析】如果编译器在编译cpp文件,那么_cplusplus就会被定义,如果是一个C文件在被编译,那么__STDC__就会被定义。__STDC__是预定义宏,当它被定义后,编译器将按照ANSIC标准来编译C语言程序。
所以,可以采用如下程序示例判断。
#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;
}
在C++编译环境下,程序输出结果如下:
C++
编写C与C++兼容的代码所需的宏如下:
#ifdef_cplusplus
extern "C" {
#endif
∥具体的代码
#ifdef_cplusplus
}
#endif
在上例中,_cplusplus是cpp中的自定义宏,当定义了这个宏时,其表示这是一段cpp的代码。也就是说,上面代码的含义为如果这是一段cpp的代码,那么加入extern"C"{和}处理其中的代码。
考虑到C语言没有重载函数的概念,所以C编译器编译的程序里,所有函数只有函数名对应的入口。而由于C++支持函数重载,如果只有函数名对应的入口,则会出现混淆,所以C++编译器编译的程序,应该是函数名+参数类型列表对应到入口。
因为main函数是整个程序的入口,所以main是不能有重载的。如果一个程序只有main()函数,是无法确认是C还是C++编译器编译的,此时可以通过nm来查看函数名入口。例如,函数int foo(int i,float j),C编译的程序通过nm查看如下:foo 0x567xxxxxx(地址)。C++编译程序,通过nm查看为foo(int,float)0x567xxxxxx。
需要注意的是,如果要在C++编译器里使用通过C编译的目标文件,必须通知C++编译器。