如何解决为什么#pragma被视为预处理器指令?
我知道它以#
开头,之后是preprocessing directives format。但是预处理器真的在乎吗? #pragma pack
,#pragma once
和我所知道的所有其他指令均由编译器执行。 this question中的注释甚至表明#pragma
指令在预处理阶段仍然有效。
所以我的问题是:
- 由于
#pragma
用于编译器,为什么将其视为预处理指令?仅仅是因为它以#
开头吗? - 预处理器真的可以对
#pragma
做些什么吗?
解决方法
为什么#pragma被视为预处理器指令?
因为C标准是这样说的。它在预处理指令C17 6.10.6一章中指定。除此之外,该标准故意#pragma
应当做什么,因为整个目的是要做特定于编译器的事情。或者,如果无法识别杂物,请忽略它。
未指定某个编译器如何在内部处理编译指示的内容。
显然需要对某些编译指示进行预处理,特别是启用/禁用某些编译器行为(例如#pragma warning ...
等)的编译指示。其中许多必须在预处理或编译期间进行评估。编译器不会编译代码。
预处理器真的可以对#pragma做些什么吗?
是的,它将在翻译阶段4中对其进行评估:“执行预处理指令,扩展宏调用,并执行_Pragma一元运算符表达式。”
请注意,将预处理器与编译器分离开基本上是一个理论模型。实际上,预处理器和编译器通常彼此紧密集成。
, #pragma once
需要由预处理程序处理,因为它的工作是替换包含保护以确保包含文件—使用预处理程序指令#include
–在给定位置仅一次。另一方面,#pragma pack
需要毫不费力地通过预处理器,因为这是向编译器发出的有关如何在内存中布置数据的指令。
直接回答您的问题:
-
除
STDC FENV_ACCESS
,STDC FP_CONTRACT
和STDC CX_LIMITED_RANGE
以外的大多数实用工具根本不是C-Standard的一部分,因此,是否真的无关紧要无论它们是否是“预处理程序指令”,编译器都可以自由选择以其认为合适的方式对其进行处理。对于某些杂件而言,在预处理阶段对它们进行处理是有意义的,而对于其他杂物则没有。编译指示背后的主要思想是,它们 可能会从预处理阶段开始影响编译过程,但与宏不同,它们不会扩展为任何东西。 -
是的,例如对于
#pragma once
,如其他答案所述。但这又是特定于实现的,不是标准规定的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。