我正在学习C语言,遇到了这个 #define。经过阅读,它是用来定义某些东西的。例如:
#define FAMILY 4
每次我将某个东西设置为family或调用family时,它的值都是4。 但我也遇到了这个:
#define EVER ;;
#define FAMILY 4
如果在“ever”后面有两个分号,“;;”,这是什么意思?它是否表示EVER = ";;"?
我正在学习C语言,遇到了这个 #define。经过阅读,它是用来定义某些东西的。例如:
#define FAMILY 4
每次我将某个东西设置为family或调用family时,它的值都是4。 但我也遇到了这个:
#define EVER ;;
#define FAMILY 4
EVER的意思与以下完全等同:
;;
这意味着你可能拥有:
#define EVER ;;
//.....
for(EVER){printf("This will print forever");}
这将等同于:
for(;;){printf("This will print forever");}
在使用别名时,您应该谨慎,因为随着应用程序变得越来越大,如果混淆了某些#define语句,可能会出现奇怪且难以调试的问题。
在我看来,经典的while(true)
循环可能更加健康,尽管不够机智。
#define HELL_UNFROZEN 1
--> while (HELL_UNFROZEN) { ... }
(开个玩笑) - glglgl预处理器是在实际编译器运行之前运行的步骤。预处理器对源代码中的宏进行简单的搜索和替换,然后将其传递给实际编译器。
例如,使用您问题中定义的EVER
宏,您可以这样使用:
for (EVER) { ... }
for (;;) { ... }
编译器将会看到这个。
for(;;) { ... }
使用
for(EVER) { ... }
为了明确它是一个无限循环,您可以这样做。
另一个选项是进行以下操作。
#define forever while (1)
forever { ... }
do { ... } forever
FAMILY
都将在编译之前被预处理器替换为4
。EVER
可能是一个宏常量,在C语言的for循环中写作for(EVER)
=for(;;)
=while(1)
=无限循环。 - Grijesh Chauhanfor(EVER)
是否比for(;;)
更易读呢?K&R书中的一个例子建议使用#define FOREVER for(;;)
,这样做几乎是有道理的,如果你想要方便地进行grep搜索。但是如果你不得不输入for(EVER)
,那么与其这样,不如直接输入for(;;)
或者while(true)
,或者其他你喜欢的方式。 - Brandin