gpt4 book ai didi

c++ - 标准允许#pragma 做什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:13 25 4
gpt4 key购买 nike

在 C++(和 C)中,我们有 #pragma 指令,它基本上具有实现定义的效果。但是,该指令的作用是否有任何限制? (请注意,我问的是标准允许的内容,而不是真正的编译器实际执行的操作。)

我确定 #pragma 可能会做的事情:

  • 允许选择多个编译选项之一,这些编译选项都会生成有效的 C++ - 例如,选择多个可用 ABI 之一,或切换某些实现定义的选项。

我猜是允许的,但我不确定:

  • 允许编译器在不发出诊断的情况下接受非法代码(例如,编译器可能决定支持新的内置类型 long long long,但任何使用该类型的代码必须发出诊断;然后可以使用例如 #pragma long long long 来抑制此诊断。

  • 允许编译器拒绝其他合法代码,例如可能有一个 #pragma strict 导致编译器将某些库函数和/或语言结构的使用标记为错误这被认为是不安全的。

我实际上怀疑的是允许的,但我也不确定:

  • 允许编译器将合法代码的语义更改为不同的东西(例如,假设编译器供应商认为如果 for 条件是后置条件(如 dowhile), 并定义了 #pragma for postcondion 以相应地切换 for 的含义。

我怀疑后者的原因是允许编译器忽略它不识别的任何 pragma,因此 pragma 的语义变化会导致相同的程序在不同的编译器上具有不同的语义。

但是,标准实际上允许什么?是否有允许但未包含在我上面的列表中的事情?

最佳答案

标准对此非常明确:

[cpp.pragma] A preprocessing directive of the form

#pragma pp-tokensopt new-line

causes the implementation to behave in an implementation-defined manner. The behavior might cause translation to fail or cause the translator or the resulting program to behave in a non-conforming manner. Any pragma that is not recognized by the implementation is ignored.

因此,编译器在看到 #pragma 时几乎可以做任何它想做的事情。

关于c++ - 标准允许#pragma 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17511269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com