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

use*_*216 6 c preprocessor pragma

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

  1. 既然#pragma是编译器,为什么它被认为是一个预处理指令?仅仅是因为它以 开头#吗?
  2. 预处理器真的对#pragma?

Lun*_*din 6

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

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

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

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

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

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

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