我无法理解GNU C PREPROCESSOR文档中的这句话

piok6c0g  于 2023-06-28  发布在  其他
关注(0)|答案(3)|浏览(109)

链接到页面
它位于“预处理器概述”中“令牌化”部分下的第9行,如下所示:
唯一可以被认为是预处理关键字的标识符是defined
我尽力了

#define DEFINED

但效果很好
我也问了chatGPT,并在网上搜索了它,但没有任何帮助。
这在实践中告诉我们什么?这给我们带来了哪些限制?

biswetbf

biswetbf1#

首先要注意的是,C是一种区分大小写的语言,所以DEFINEDdefined的意思是不同的。文本所指的是特殊标识符defined,仅在预处理器宏中有效。用法是这样的:

#if defined(__STDC__) && (__STDC__VERSION == 201710L)
  puts("This C compiler is up to date.");
#endif

这相当于:

#ifdef __STDC__
  #if (__STDC__VERSION == 201710L)
    puts("This C compiler is up to date.");
  #endif
#endif

正如我们所看到的,define的好处是,它允许更简单的预处理器检查,而无需求助于多个嵌套的#if/#ifdef。假设我们要检查编译器是否遵循标准C并且也支持VLA:

#if defined(__STDC__) && !defined(__STDC_NO_VLA__)
  puts("This compiler is useful");
#else
  puts("This compiler is useless");
#endif

与这种混乱相比,这是一个更方便的代码,没有代码重复:

#ifdef __STDC__
  #ifndef __STDC_NO_VLA__
    puts("This compiler is useful");
  #else
    puts("This compiler is useless");
  #endif
#else
  puts("This compiler is useless");
#endif
gojuced7

gojuced72#

我尽力了

#define DEFINED

但效果很好
C是大小写敏感的。definedDEFINED不同。
这在实践中告诉我们什么?这给我们带来了哪些限制?
defined关键字仅在#if#elif预处理指令的表达式中可用。
从理论上讲,你可以创建模棱两可的代码,比如:

#define defined
#if defined defined
    // Is this line included or not?
#endif

我想你更有可能得到一个编译器错误。
在现实世界中,这不是一个问题。只是不定义defined预处理符号。这相当于无法创建名为ifwhile的变量。

vcudknz3

vcudknz33#

这是因为你可以写:

#ifdef MACRO

或者:

#if defined MACRO

所以你不能命名一个定义的宏,因为它是一个关键字。

相关问题