ABI兼容不同的C / C ++语言版本+ GNU扩展

时间:2014-08-08 21:18:25

标签: c++ c gcc linker

我目前正在使用gcc 4.8.2而没有std选项来编译我的c / c ++代码。 现在我想使用c / c ++的新语言版本提供的一些新的C / C ++特性。

(Un?)幸运的是,gcc了解很多种C / C ++:

  • c90,c99,c11,gnu90,gnu99,gnu11
  • c ++ 98,c ++ 03,c ++ 11,gnu ++ 98,gnu ++ 03,gnu ++ 11

目前我在问自己:

  • 我是否需要为每个c / c ++版本提供单独的库,或者是否可以将一个库用于多个C / C ++版本?
  • 当我使用带有gnu扩展名的相应c / c ++版本时,我是否可以链接使用特定c / c ++版本编译的库?

澄清(根据评论)

请注意,我只使用一个编译器。不是两个只有版本号不同的gcc。 当只使用一个gcc编译器时,我只是要求不同std选项之间的ABI不兼容。

1 个答案:

答案 0 :(得分:1)

一般来说:

  • 您无法在同一程序中合并不同的语言版本,这会导致许多库标题中出现“One Definition Rule”违规行为。

在有限的情况下,您可能会发现某些类实际上不会随语言版本而更改。然而,这种情况很少见,C ++ 11标准需要rvalue引用,而C ++ 03模式则不能提供rvalue引用。

对于支持和不支持GNU扩展的版本,您可能会获得更多成功,但仍需要通过预处理器运行每个头,并验证编译器是否可以看到完全相同的令牌序列两种选择。

这完全不同于ABI更改,这可能导致内存布局或名称修改在编译器变体之间有所不同。

您还可以避免使用任何版本和特定于语言的功能,从而避免在您自己的公共API上违反单定义规则。从本质上讲,这意味着一个扁平的C API。