链接到页面它位于“预处理器概述”中“令牌化”部分下的第9行,如下所示:唯一可以被认为是预处理关键字的标识符是defined。我尽力了
defined
#define DEFINED
但效果很好我也问了chatGPT,并在网上搜索了它,但没有任何帮助。这在实践中告诉我们什么?这给我们带来了哪些限制?
biswetbf1#
首先要注意的是,C是一种区分大小写的语言,所以DEFINED和defined的意思是不同的。文本所指的是特殊标识符defined,仅在预处理器宏中有效。用法是这样的:
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:
define
#if
#ifdef
#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
gojuced72#
我尽力了
但效果很好C是大小写敏感的。defined与DEFINED不同。这在实践中告诉我们什么?这给我们带来了哪些限制?defined关键字仅在#if和#elif预处理指令的表达式中可用。从理论上讲,你可以创建模棱两可的代码,比如:
#elif
#define defined #if defined defined // Is this line included or not? #endif
我想你更有可能得到一个编译器错误。在现实世界中,这不是一个问题。只是不定义defined预处理符号。这相当于无法创建名为if或while的变量。
if
while
vcudknz33#
这是因为你可以写:
#ifdef MACRO
或者:
#if defined MACRO
所以你不能命名一个定义的宏,因为它是一个关键字。
3条答案
按热度按时间biswetbf1#
首先要注意的是,C是一种区分大小写的语言,所以
DEFINED
和defined
的意思是不同的。文本所指的是特殊标识符defined
,仅在预处理器宏中有效。用法是这样的:这相当于:
正如我们所看到的,
define
的好处是,它允许更简单的预处理器检查,而无需求助于多个嵌套的#if
/#ifdef
。假设我们要检查编译器是否遵循标准C并且也支持VLA:与这种混乱相比,这是一个更方便的代码,没有代码重复:
gojuced72#
我尽力了
但效果很好
C是大小写敏感的。
defined
与DEFINED
不同。这在实践中告诉我们什么?这给我们带来了哪些限制?
defined
关键字仅在#if
和#elif
预处理指令的表达式中可用。从理论上讲,你可以创建模棱两可的代码,比如:
我想你更有可能得到一个编译器错误。
在现实世界中,这不是一个问题。只是不定义
defined
预处理符号。这相当于无法创建名为if
或while
的变量。vcudknz33#
这是因为你可以写:
或者:
所以你不能命名一个定义的宏,因为它是一个关键字。