这个定义是什么意思?

3

我正在学习C语言,遇到了这个 #define。经过阅读,它是用来定义某些东西的。例如:

#define FAMILY 4

每次我将某个东西设置为family或调用family时,它的值都是4。 但我也遇到了这个:

#define EVER ;;
#define FAMILY 4

如果在“ever”后面有两个分号,“;;”,这是什么意思?它是否表示EVER = ";;"?

1
你正在定义宏常量,代码中的每个FAMILY都将在编译之前被预处理器替换为4EVER可能是一个宏常量,在C语言的for循环中写作for(EVER)=for(;;)=while(1)=无限循环。 - Grijesh Chauhan
2
for(EVER)是否比for(;;)更易读呢?K&R书中的一个例子建议使用#define FOREVER for(;;),这样做几乎是有道理的,如果你想要方便地进行grep搜索。但是如果你不得不输入for(EVER),那么与其这样,不如直接输入for(;;)或者while(true),或者其他你喜欢的方式。 - Brandin
3个回答

11

EVER的意思与以下完全等同:

;;

这意味着你可能拥有:

#define EVER ;;

//..... 

for(EVER){printf("This will print forever");}

这将等同于:

for(;;){printf("This will print forever");}

在使用别名时,您应该谨慎,因为随着应用程序变得越来越大,如果混淆了某些#define语句,可能会出现奇怪且难以调试的问题。

在我看来,经典的while(true)循环可能更加健康,尽管不够机智。


1
#define HELL_UNFROZEN 1 --> while (HELL_UNFROZEN) { ... }(开个玩笑) - glglgl
1
@glglgl 或 #define PIGS_DO_NOT_FLY true - nestedloop

5

预处理器是在实际编译器运行之前运行的步骤。预处理器对源代码中的宏进行简单的搜索和替换,然后将其传递给实际编译器。

例如,使用您问题中定义的EVER宏,您可以这样使用:

for (EVER) { ... }

并且预处理器将简单地将其转换为
for (;;) { ... }

编译器将会看到这个。


1
这个答案中的前两个语句在技术上并不准确。预处理器可能会被集成到编译器中,并且预处理可能会与编译的其他部分交织在一起,就像在GCC中一样,而不是在编译的其余部分之前执行。宏替换不是简单的搜索和替换;它操作预处理器标记,而不是文本,并具有超出简单搜索和替换的语义。 - Eric Postpischil

5
这是一种有趣的替代无限循环的方式。
for(;;) { ... }

使用

for(EVER) { ... }

为了明确它是一个无限循环,您可以这样做。

另一个选项是进行以下操作。

#define forever while (1)

所以我们可以这样做。
forever { ... }

甚至更多。
do { ... } forever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接