首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么#务实被认为是一个预处理指令?

为什么#务实被认为是一个预处理指令?
EN

Stack Overflow用户
提问于 2020-09-07 08:13:31
回答 3查看 419关注 0票数 8

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

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

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-07 08:29:08

为什么#务实被认为是一个预处理指令?

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

没有指定特定编译器如何在内部处理杂注的内容。

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

预处理器真的用#实用主义做些什么吗?

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

请注意,将预处理器与编译器分离主要是一个理论模型。在现实中,预处理器和编译器通常是紧密地集成在一起的。

票数 7
EN

Stack Overflow用户

发布于 2020-09-07 08:24:53

#pragma once需要由预处理器处理,因为它的工作是替换包含保护,以确保在给定位置只包含一个文件(使用预处理器指令#include )一次。另一方面,#pragma pack需要不受损伤地通过预处理程序,因为它是编译器关于如何在内存中放置数据的指令。

票数 2
EN

Stack Overflow用户

发布于 2020-09-07 08:33:11

直接回答你的问题:

  1. 除了STDC FENV_ACCESSSTDC FP_CONTRACTSTDC CX_LIMITED_RANGE之外,大多数实用程序根本不属于C标准,因此不管它们是否是“预处理器指令”,编译器都可以自由地以它认为合适的任何方式处理它们。对一些语用而言,在预处理阶段对它们进行处理是有意义的,而其他的则不然。语用背后的主要思想是,它们可能会从预处理阶段开始影响编译过程,但与宏不同的是,它们不会扩展到任何东西。
  2. 是的,例如在#pragma once的情况下,正如其他答案所解释的那样。但同样,这是具体的实施,没有规定的标准。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63773738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档