编译器如何处理枚举中的符号常量?

本地主机

如果我们谈论宏,那么编译器会在预处理阶段处理宏,但是枚举器呢?编译器如何看待它们。例如,请参见以下代码:

#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-constantsprintf()声明中使用。枚举器内部是否与宏类似?在预处理过程中,所有这些符号常量都将被整数常量替换吗?编译器如何精确地处理它们?

约翰·布林格

枚举器内部是否与宏类似?

是的,有些不。

在预处理过程中,所有这些符号常量都将被整数常量替换吗?

不可以。除预处理指令,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C编译器如何处理枚举?

编译器如何处理无符号整数的减法?

Scala编译器如何处理具体特征方法?

C编译器如何处理位域?

编译器如何处理数据类型?

编译器如何处理case语句?

C编译器如何处理无符号和有符号整数?为什么无符号和有符号算术运算的汇编代码相同?

如何处理递归函数和迭代函数中的编译器错误 c2660?

python3 grpc编译器:如何处理.protos中的绝对和相对导入?

用编译语言编写的编译器如何处理错误?

在C#编译器和虚拟机中如何处理lambda表达式?

赋值中涉及二进制运算时,编译器如何处理自动变量

如何在 Lazarus IDE 中定义编译器符号?

使Java编译器在类文件中包含符号常量字段引用-可能吗?

c++ 枚举中如何处理常量表达式?

如何获得编译器版本符号

Scala编译器如何处理未使用的变量值?

访问者模式和编译器代码生成,如何处理分配?

未使用的原语数组:javac和JIT编译器如何处理它?

编译器如何处理已部分应用的布尔参数?

C#编译器如何处理重载显式强制转换运算符?

Angular编译器如何处理具有相同名称的多个模板引用变量

一遍C编译器如何处理标签?

Java编译器如何处理“公共接口A扩展B <A>”之类的代码

C 编译器如何处理使用未初始化的变量?

编译器如何处理超出范围的char值?

编译器如何处理始终为true或false的语句?

动态类型语言的编译器如何处理非局部变量的更改?

C ++ / g ++:在这种情况下,编译器如何处理内存分配?