C语言中的枚举类型及其链接

C语言中的枚举类型及其链接,c,enums,linkage,C,Enums,Linkage,以下代码为什么以及如何工作 a和b都有外部链接,但它们可以按无链接的类型声明吗 如果不是,为什么a.c中的MyEnum_t和b.c中的MyEnum_t之间没有冲突 a、 h b、 h a、 c 打印: 1. 三, gcc版本4.5.0 20100604[gcc-4_5-branch修订版160292](SUSE Linux)编译后,enum类型及其值不再存在enum是一个C结构,与机器的实际运行方式无关。您完全可以在不同的转换单位中为特定的枚举类型指定不同的值。以后链接器将对此无能为力 如果您想

以下代码为什么以及如何工作

a和b都有外部链接,但它们可以按无链接的类型声明吗

如果不是,为什么a.c中的MyEnum_t和b.c中的MyEnum_t之间没有冲突

a、 h

b、 h

a、 c

打印: 1. 三,


gcc版本4.5.0 20100604[gcc-4_5-branch修订版160292](SUSE Linux)

编译后,
enum
类型及其值不再存在
enum
是一个C结构,与机器的实际运行方式无关。您完全可以在不同的转换单位中为特定的枚举类型指定不同的值。以后链接器将对此无能为力

如果您想确保您的
enum
类型是一致的,那么您可能应该在所有翻译单元包含的公共标题中放置一个定义


编辑注:不要使用带前导下划线的标识符。它们由实现保留。

编译后,
enum
类型及其值不再存在
enum
是一个C结构,与机器的实际运行方式无关。您完全可以在不同的转换单位中为特定的枚举类型指定不同的值。以后链接器将对此无能为力

如果您想确保您的
enum
类型是一致的,那么您可能应该在所有翻译单元包含的公共标题中放置一个定义


编辑注:不要使用带前导下划线的标识符。它们由实现保留。

侧节点:您可以简单地编写
typedef enum{ONE=1,TWO}MyEnum在单步侧节点中:您可以简单地写入
typedef enum{ONE=1,TWO}MyEnum单步执行
#ifndef _A_H_
#define _A_H_
void print_a_enum();
#endif
#ifndef _B_H_
#define _B_H_
void print_b_enum();
#endif
#include "a.h"
#include <stdio.h>

enum MyEnum{ ONE = 1, TWO = 2};
typedef enum MyEnum MyEnum_t;

MyEnum_t a = ONE;

void print_a_enum()
{
    printf("%d\n", a);
}
#include "b.h"
#include <stdio.h>

enum MyEnum{ ONE = 3, TWO = 4};
typedef enum MyEnum MyEnum_t;

MyEnum_t b = ONE;

void print_b_enum()
{
    printf("%d\n", b);
}
#include "a.h"
#include "b.h"

int main()
{
     print_a_enum();
     print_b_enum()
}