为什么我不能在C中获得枚举的"多重定义"?

Paz*_*Paz 8 c enums

假设我有三个文件:

//m.h
const int RED = 1;
//m.h ends here

//f1.c
#include "m.h"
//f1.c ends here


//f2.c
#include "m.h"
int main() {return 0;}
//f2.c ends here
Run Code Online (Sandbox Code Playgroud)

单独编译每个将工作,但gcc -Wall f1.o f2.o -o prog将产生: multiple definition of 'RED'

现在,如果我用以下内容替换const:

//m.h
enum {RED=1} colors;
//m.h ends here
Run Code Online (Sandbox Code Playgroud)

我将能够编译progRED用作const,不会出现任何 multiple definition错误.

enum当您在不同文件中使用具有相同名称的全局变量或结构时,为什么s 的行为与可见的行为不同?

DAh*_*ens 5

枚举不会在内存中创建值,这意味着链接时不会将地址添加到符号表中。

const 变量在编译对象中将有一个地址,以及一个符号名称。当您尝试将两个目标文件链接在一起时,它们每个都有相同的符号名称“RED”指向不同的地址,这就是导致冲突的原因。