0

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

a 和 b 都具有外部链接,但它们可以通过无链接类型声明吗?

如果不是,为什么 ac 中的 MyEnum_t 和 bc 中的 MyEnum_t 之间没有冲突?

#ifndef _A_H_
#define _A_H_
void print_a_enum();
#endif

bh

#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()
}

打印输出:1 3

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

4

1 回答 1

3

enum编译后类型及其值根本不存在 。enum是一个 C 结构,与您的机器实际运行方式无关。您完全可以在不同的翻译单元中为特定的枚举类型赋予不同的值。链接器稍后将无能为力。

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

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

于 2013-07-23T17:25:56.410 回答