#define 在编译器中做什么?

问题描述 投票:0回答:1

我使用 C 已经一年多了,我想知道

#define
到底是如何工作的。 我知道你可以将它用作宏,例如。
#define MUL(x, y) (x*y)
,但是当你定义某件事而不给出定义时会发生什么? 例如

    #ifndef _SYNNOVESLIB_H
    #define _SYNNOVESLIB_H
    #endif

它是否只是被 GCC 或正在使用的任何编译器标记为“已定义”或 true(如 1 中所示)?

c gcc compiler-construction
1个回答
1
投票

是的,

#define _SYNNOVESLIB_H
只是告诉编译器定义
_SYNNOVESLIB_H
是为了检查是否定义了宏,例如
defined
#ifdef
#ifndef

6.10 预处理指令 提供了

#define
的语法。

control-line:
  # define identifier replacement-list new-line

replacement-list: 
  pp-tokens(opt)

pp-tokens:
  preprocessing-token
  pp-tokens preprocessing-token

replacement-list
是预处理器标记的可选列表,因此它可以为空。

来自 6.10.1 有条件包含

  1. 控制条件包含的表达式应为整数常量表达式,但以下情况除外:标识符(包括词法上与关键字相同的标识符)解释如下;169)并且它可以包含以下形式的一元运算符表达式

defined identifier

defined ( identifier )

如果标识符当前被定义为宏名称(即,如果它是预定义的,或者 如果它是 #define 预处理指令的主题,而没有具有相同主题标识符的介入 #undef 指令,则计算结果为 1 ),如果不是则为 0。

请注意,该值并不重要,只要它已被定义即可。

  1. 表单的预处理指令

# ifdef identifier new-line groupopt

# ifndef identifier new-line groupopt

检查标识符当前是否定义为宏名称。它们的条件分别相当于

#if defined identifier
#if !defined identifier

编译器内部具体如何处理这取决于编译器,但一个简单的哈希表就可以了。

#define _SYNNOVESLIB_H
将添加具有 null 或空值的
_SYNNOVESLIB_H
键。
#ifndef _SYNNOVESLIB_H
将检查哈希表中是否存在键,忽略值。
#undef _SYNNOVESLIB_H
从桌子上移除钥匙。

© www.soinside.com 2019 - 2024. All rights reserved.