如果我们谈论宏,那么编译器会在预处理阶段处理宏,但是枚举器呢?编译器如何看待它们。例如,请参见以下代码:
#include <stdio.h>
enum day {sunday = 1, monday, tuesday = 5,
wednesday, thursday = 10, friday, saturday};
int main()
{
printf("%d %d %d %d %d %d %d", sunday, monday, tuesday,
wednesday, thursday, friday, saturday);
return 0;
}
在此特定示例中,我什至没有为枚举数据类型创建任何变量。我只是enumeration-constants
在printf()
声明中使用。枚举器内部是否与宏类似?在预处理过程中,所有这些符号常量都将被整数常量替换吗?编译器如何精确地处理它们?
枚举器内部是否与宏类似?
是的,有些不。
在预处理过程中,所有这些符号常量都将被整数常量替换吗?
不可以。除预处理指令,defined
运算符和已定义的宏名称之外,预处理器不知道另一个标识符。您可以尝试以下方法:
#include <stdio.h>
#define MACRO_TRUE 1
enum bool_enum { ENUM_FALSE = 0, ENUM_TRUE = 1 };
int main(void) {
#if MACRO_TRUE
puts("Macro identifiers are known to the preprocessor.");
#else
puts("Macro identifiers are not known to the preprocessor.");
#endif
#if ENUM_TRUE
puts("Enum constants are known to the preprocessor.");
#else
puts("Enum constants are not known to the preprocessor.");
#endif
}
输出应为
Macro identifiers are known to the preprocessor.
Enum constants are not known to the preprocessor.
编译器如何精确地处理它们?
范围内枚举常量与其他整数常量类似,例如42
,但上述警告除外,即预处理器不会解释它们。例如,它们可用于整数常量表达式,这对于多种目的是必需的,例如语句中的case
标签switch
。该标准没有规定的细节,但大多数编译器把它们类似于宏在没有存储在可执行文件中为它们保留-仿佛枚举常数通过其对应的整数值替换,无论他们出现在表达式中源处理,之后预处理。当然,它们不能标识对象,因为它们不是运算&
符的可接受操作数。
这与const
-限定变量的行为有所区别。这些标识实际对象,而不仅仅是常量。它们可能不会在常量表达式中使用,并且它们确实具有与它们关联的存储(至少在抽象机中),因此可以通过&
运算符获取它们的地址。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句