发布于 2020-09-07 08:29:08
为什么#务实被认为是一个预处理指令?
因为C标准这么说。它是在章节预处理指令( C17 6.10.6 )中指定的。除此之外,这个标准对#pragma应该做的事情有意地非常模糊,因为它的全部目的是做一些特定于编译器的事情。或者,如果语用不被识别--忽略它。
没有指定特定编译器如何在内部处理杂注的内容。
一些语用显然需要进行预处理,特别是启用/禁用某些编译器行为(如#pragma warning ...等)的那种。在预处理过程中必须对其中的许多功能进行评估,否则编译器将不知道如何编译代码。
预处理器真的用#实用主义做些什么吗?
是的,它在翻译阶段4中评估它:“执行预处理指令,展开宏调用,执行_Pragma一元运算符表达式。”
请注意,将预处理器与编译器分离主要是一个理论模型。在现实中,预处理器和编译器通常是紧密地集成在一起的。
发布于 2020-09-07 08:24:53
#pragma once需要由预处理器处理,因为它的工作是替换包含保护,以确保在给定位置只包含一个文件(使用预处理器指令#include )一次。另一方面,#pragma pack需要不受损伤地通过预处理程序,因为它是编译器关于如何在内存中放置数据的指令。
发布于 2020-09-07 08:33:11
直接回答你的问题:
STDC FENV_ACCESS、STDC FP_CONTRACT和STDC CX_LIMITED_RANGE之外,大多数实用程序根本不属于C标准,因此不管它们是否是“预处理器指令”,编译器都可以自由地以它认为合适的任何方式处理它们。对一些语用而言,在预处理阶段对它们进行处理是有意义的,而其他的则不然。语用背后的主要思想是,它们可能会从预处理阶段开始影响编译过程,但与宏不同的是,它们不会扩展到任何东西。#pragma once的情况下,正如其他答案所解释的那样。但同样,这是具体的实施,没有规定的标准。https://stackoverflow.com/questions/63773738
复制相似问题