打印

如何判断一段程序是由C编译程序还是由C++编译程序编译的?

[复制链接]
668|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daily媛媛|  楼主 | 2018-12-21 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
tyw| | 2018-12-21 10:09 | 只看该作者
如何判断一段程序是由C 编译程序还是由C++编译程序编译的?
2015年02月28日 10:42:09 denkensk 阅读数:1690 标签: 更多个人分类: c++/c总结





以下是在论坛中看到的两种解释:

(1)如果是要你的代码在编译时发现编译器类型,就判断_cplusplus或_STDC_宏,通常许多编译器还有其他编译标志宏,

#ifdef __cplusplus
       cout<<"c++";
#else
       cout<<"c";
#endif

如果要判断已经编译的代码的编译类型,就用nm查一下输出函数符号是否和函数名相同。(相同为c,不同为c++。详解见下面)



  
(2)简单是说,由于c语言是没有重载函数的概念的,所以c编译器编译的程序里,所有函数只有函数名对应的入口。而由于c++语言有重载函数的概念,如果只有函数名对应的入口,则会出现混淆,所以c++编译器编译的程序,应该是函数名+参数类型列表对应到入口。

注意,因为mian函数是整个程序的入口,所以mian是不能有重载的,所以,如果一个程序只有main函数,是无法确认是c还是c++编译器


编译的可以通过nm来查看函数名入口

如一个函数   

int foo(int i, float j)


c编译的程序通过nm查看

foo                   0x567xxxxxx    (地址)

c++编译程序,通过nm查看
foo(int, float)    0x567xxxxxx
   
另外,如果要在c++编译器里使用通过c编译的目标文件,必须通知c++编译器,我使用的函数是c风格的,不需要列出参数列表的,这样c++编译才能正确的连接extern   "c"  foo;



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

38

帖子

0

粉丝