тип перечисления и его связь в C

почему и как работает следующий код?

и a, и b имеют внешнюю связь, но могут ли они быть объявлены типами без связи?

если нет, то почему нет конфликта между MyEnum_t в ac и MyEnum_t в bc?

a.h

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

b.h

#ifndef _B_H_
#define _B_H_
void print_b_enum();
#endif

a.c

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

b.c

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

main.c

#include "a.h"
#include "b.h"

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

распечатать: 1 3

gcc версии 4.5.0 20100604 [gcc-4_5-ветка, редакция 160292] (SUSE Linux)


person Community    schedule 23.07.2013    source источник
comment
Боковой узел: вы можете просто написать typedef enum{ ONE = 1, TWO } MyEnum; за один шаг   -  person Grijesh Chauhan    schedule 23.07.2013


Ответы (1)


Тип enum и его значения просто больше не существуют после компиляции. enum - это конструкция C, не имеющая никакого отношения к тому, как на самом деле работает ваша машина. Вам вполне разрешено присваивать определенному типу перечисления разные значения в разных единицах перевода. Компоновщик ничего не сможет сделать с этим позже.

Если вы хотите убедиться, что ваш тип enum непротиворечив, вам, вероятно, следует поместить его единственное определение в общий заголовок, включенный во все единицы перевода.

Примечание редактора: не используйте идентификаторы с ведущими символами подчеркивания. Они зарезервированы реализацией.

person Carl Norum    schedule 23.07.2013