可以将不同的GCC方言联系在一起吗?

Ker*_* SB 18 c++ linker gcc undefined-behavior dialect

我知道原则上这可能是未定义的行为,但为了处理大型项目,这里是关于GCC的问题:

假设我使用完全相同的编译器安装编译一个转换单元gcc -std=c++98,另一个-std=c++11使用.是否有任何保证可以链接两个目标文件并获得定义良好的程序?

据我所知,由于不同的宏,潜在的问题只能来自库头的不同视图,而这些问题反过来最多只能新的成员函数添加到标准库类中,而不是成员对象.

这会以某种方式使用不同的语言方言选项编译更大项目的不同部分是否可以接受?

更新:我应该添加一个正交的问题:如何使用两个不同版本的GCC(比如4.3和4.6),但是同一个方言选项(-std=c++98)?此GCC文档中的列表似乎表明该库在4.2.2和4.6之间兼容.

Jam*_*nze 10

先天,没有.最安全的解决方案是假设所有编译器选项都是相同的,除非编译器专门记录该选项不影响二进制兼容性.(在大多数编译器中都非常缺乏的文档.)实际上,在缺少文档的情况下,控制警告的选项(-W...以g ++为单位)不会影响二进制兼容性,以及影响代码生成的选项(语言)似乎是一种安全的选择.等级可能:g ++通常保持不同优化级别之间的兼容性,而VC++则不然.

另一个真正的问题是在命令行中定义预处理程序符号.同样,最安全的选择是所有定义都是相同的,但同样,一些常识是有序的:人们很难指望标准库已经使用在您的项目中使用的预处理器符号进行编译(比如MYPROG_CONFIG_FILE_LOCATION,说, ).另一方面,请注意预处理器的定义_GLIBCXX_DEBUG_GLIBCXX_DEBUG_PEDANTIC将影响二进制兼容性(尽管g ++确保您将获得一个与它们一起使用的库版本,如果您一致地使用它们).

关于你的问题:由于标准版本的原因,我不希望对二进制兼容性产生太大影响,如果选择影响某些预定义的预处理器符号,以某种方式破坏库中的二进制兼容性,我就不会感到惊讶,好像你用一些模块编译了一些模块_GLIBCXX_DEBUG,有些模块没有.它可能会奏效,但我不会指望它.