Oracle® Developer Studio 12.5:GCC 兼容性指南

退出打印视图

更新时间: 2016 年 7 月
 
 

预处理程序兼容性

Oracle Developer Studio C 和 C++ 编译器内置了自己的 C 预处理程序实现,并会在缺省情况下使用该预处理程序。这些预处理程序具有下列与 gcc 兼容的扩展。

Oracle Developer Studio 预处理程序

  • #warning

  • #include_next(用来实现包装头)

某些代码如果依赖于传统模式的预处理程序行为,则也会在 Oracle Developer Studio 和 GCC 编译器之间遇到差异。gcc 的传统模式如 https://gcc.gnu.org/onlinedocs/cpp/Traditional-Mode.html 所述。

在 Oracle Solaris 上,如果需要实现传统行为,您也可以使用 /usr/lib/cpp 加以实现,但最佳做法是将这些依赖关系替换为更现代的用法。/usr/lib/cpp 在设计时并不是一个打算与 gcc 完全兼容的预处理程序。

下文显示了有时会在源代码中看到的示例。

示例 1  使用空注释的标记粘贴
FOO/**/BAR

此时输出中应该会出现 “FOOBAR”。但在 gcc 或 Oracle Developer Studio 中,这种情况不会出现,除非采取了特殊步骤启用了传统模式。在 Oracle Developer Studio C 中,这意味着指定 –Xs 选项。在 gcc 中,您必须指定 –traditional-cpp 选项。最好更新代码,使用 C 和 C++ 中定义的标准 ## 标记粘贴运算符。

示例 2  标记之间的间距
#define FOO foo
#define BAR bar
FOO-BAR

这里预计会输出 “FOO-BAR” 而不是 “FOO - BAR”。预处理程序可能会(也可能不会)在 '-' 符号前后添加额外空格。gcc 编译器不会添加空格,但将编译器用作预处理程序并指定了 –E–P 选项时,某些代码会依赖于该行为。要实现传统行为,您可以将 –Xs 与 Oracle Developer Studio C 编译器一起使用(但在 Oracle Developer Studio C++ 中不受支持),或者可以直接使用 /usr/lib/cpp