繁体   English   中英

为什么#pragma 被视为预处理器指令?

[英]Why is #pragma considered a preprocessor directive?

我知道它以#开头,并且遵循预处理指令格式 但是预处理器真的关心它吗? #pragma pack#pragma once以及我知道的所有其他指令都由编译器处理。 这个问题中的评论甚至指出#pragma指令在预处理阶段仍然存在。 所以我的问题是:

  1. 由于#pragma用于编译器,为什么将其视为预处理指令? 仅仅是因为它以#开头吗?
  2. 预处理器真的用#pragma做些什么吗?

为什么#pragma 被视为预处理器指令?

因为 C 标准是这么说的。 它在预处理指令一章中指定,C17 6.10.6。 除此之外,标准对#pragma应该做什么故意非常模糊,因为整个目的是做一些特定于编译器的事情。 或者如果编译指示不被识别 - 忽略它。

没有指定某个编译器如何在内部处理 pragma 的内容。

一些 pragma 显然需要预处理,特别是启用/禁用某些编译器行为的那种,如#pragma warning ...等。其中很多必须在预处理期间进行评估,否则编译器将不知道如何编译代码。

预处理器真的用#pragma 做些什么吗?

是的,它在翻译阶段 4 中对其进行评估:“执行预处理指令,扩展宏调用,并执行 _Pragma 一元运算符表达式。”

请注意,将预处理器与编译器分开主要是一种理论模型。 实际上,预处理器和编译器通常彼此紧密集成。

#pragma once需要由预处理器处理,因为它的工作是替换包含保护以确保文件被包含 -使用预处理器指令#include - 在给定位置仅包含一次。 另一方面, #pragma pack需要毫发无损地通过预处理器,因为它是给编译器的关于如何在内存中布置数据的指令。

要直接回答您的问题:

  1. 大多数编译指示,除了STDC FENV_ACCESSSTDC FP_CONTRACTSTDC CX_LIMITED_RANGE根本不是 C 标准的一部分,因此它们是否是“预处理器指令”并不重要,编译器是免费的以任何它认为合适的方式处理它们。 对于某些编译指示,在预处理阶段处理它们是有意义的,而对于其他编译指示则不需要。 pragma 背后的主要思想是它们可以潜在地影响从预处理阶段开始的编译过程,但与宏不同的是,它们不会扩展到任何东西。

  2. 是的,例如在#pragma once的情况下,正如其他答案所解释的那样。 但同样,这是特定于实现的,而不是标准规定的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM