可以将 GCC 配置为忽略 #pragma 指令吗?

Posted

技术标签:

【中文标题】可以将 GCC 配置为忽略 #pragma 指令吗?【英文标题】:Can GCC be configured to ignore #pragma directives? 【发布时间】:2019-01-08 22:26:57 【问题描述】:

我们正在使用以下编译命令在沙盒环境中编译和运行用户提交的 C++ 程序:

g++ -std=gnu++11 -O2 -o program.exe program.cpp
但是,用户可以使用 pragma 指令覆盖编译标志。例如,可以使用以下代码覆盖优化级别:
#pragma GCC optimize("Ofast")
我们无法控制提交编译的源代码,但我们需要防止编译选项被覆盖。

有没有办法使用 GCC 忽略 pragma 指令?

【问题讨论】:

编译前为什么不能处理源码? @hyde:可能比看起来更难,尤其是考虑到 C99/C++11 _Pragma 运算符。 【参考方案1】:

快速浏览一下手册页,答案是“否”,gcc 没有“禁用编译指示”功能。

作为一个真正荒谬的解决方法,您可以简单地要求所有条目完全省略字符串pragma(对块the _Pragma operator 也不区分大小写),拒绝任何违反该要求的内容。任何更复杂的东西,本质上都需要编写自己的 C 源代码解析器,我怀疑这是否值得。考虑到您可以使用预处理器玩的令牌连接技巧,甚至不确定这是否会起作用(我正在等待评论展示这种利用)。

【讨论】:

Preprosessor 技巧应该很容易避免,首先运行 preprosessor,然后在编译前过滤/检查 preprosessor 输出(C 代码)。 @hyde:是的。取决于他们的提交系统有多灵活(从他们的问题中听起来不是很灵活,例如他​​们声称他们根本无法控制源代码)。

以上是关于可以将 GCC 配置为忽略 #pragma 指令吗?的主要内容,如果未能解决你的问题,请参考以下文章

编译器处理警告错误 #pragma GCC diagnostic ignored "-Wunused"

Visual中#pragma comment(user)和gcc中#pragma Comment的目的

#pragma使用分析

在gfortran中使用“pragma GCC优化”

第24课 #pragma 使用分析

GCC 标志忽略指令依赖