函数原型声明中间能否用_Pragma运算符?其合规性属未指定还是实现定义?
关于C11中_Pragma运算符位置的行为界定
先看这段代码:
void _Pragma("function") f() { int i = 0; _Pragma("loop"); while (i < 100) { ... } }
这段代码能被GCC正常编译,但在C11标准(N1570)里,找不到明确允许_Pragma出现在void和f()之间这类位置的依据:
- 标准6.10.9节“Pragma运算符”规定
_Pragma是形如_Pragma ( string-literal )的一元运算符表达式,但给出的示例行为和单独成行的#pragma几乎一致; - 6.5.3节“一元运算符”完全没提到
_Pragma,从语法规则里找不到允许一元运算符出现在函数返回类型与函数名之间的依据。
GCC文档仅说明:“标准未明确_Pragma运算符可出现的位置”。
针对核心疑问——这种用法属于未指定行为还是实现定义行为?结论是实现定义行为:
- 未指定行为是标准对结果无任何规定,不同实现可能产生任意结果;
- 实现定义行为是标准允许各实现自行决定行为并明确文档说明。GCC明确支持该用法,且文档说明了标准未明确位置的情况,属于实现自行定义并告知用户的行为范畴,符合实现定义行为的定义。
内容的提问来源于stack exchange,提问作者anol
相关产品推荐
相关产品推荐

