7 编译指示(Pragmas)
#pragma 指令是 C 标准指定的向编译器提供语言本身无法传达的额外信息的方法。C 标准规定的这种指令(通常称为编译指示)以 STDC 为前缀。C 编译器可以自由地赋予其他编译指示任何它喜欢的含义。大多数由 GNU 定义和支持的编译指示都带有 GCC 前缀。
C99 引入了 _Pragma 操作符。这一特性解决了 #pragma 的一个主要问题:作为一个指令,它不能作为宏扩展的结果产生。_Pragma 是一种操作符,类似于 sizeof 或 defined,可以嵌入到宏中。
其语法为 _Pragma (string-literal),其中 string-literal 可以是普通或宽字符字符串字面量。它通过将所有 '\\' 替换为单个 '\' 并将所有 \" 替换为 " 来进行字符串化处理。然后,结果会被当作出现在 #pragma 指令右侧的内容来处理。例如,
_Pragma ("GCC dependency \"parse.y\"")
的效果等同于:
#pragma GCC dependency "parse.y"
同样的效果可以通过宏实现:
#define DO_PRAGMA(x) _Pragma (#x)
DO_PRAGMA (GCC dependency "parse.y")
标准对于 _Pragma 操作符可以在哪里出现并不明确。预处理器不接受它出现在类似 #if 这样的预处理条件指令内。为了安全起见,您最好将其放在除 #define 之外的指令之外,并单独占一行。
本手册记录了对预处理器本身有意义的编译指示。其他编译指示对 C 或 C++ 编译器有意义,在 GCC 手册中有文档说明。GCC 插件可以提供自己的编译指示。
常用的 GCC 编译指示:
-
#pragma GCC dependency
允许检查当前文件和另一个文件的相对日期。如果另一个文件比当前文件更新,则发出警告。这对于当前文件是从另一个文件派生且应重新生成的情况非常有用。另一个文件使用正常的包含搜索路径查找。可选的尾随文本可用于在警告消息中提供更多详细信息。
#pragma GCC dependency "parse.y" #pragma GCC dependency "/usr/include/time.h" rerun fixincludes -
<

最低0.47元/天 解锁文章
1753

被折叠的 条评论
为什么被折叠?



