В чем причина typedef против struct / union / enum, не может ли быть только одно пространство имен? - PullRequest
6 голосов
/ 09 октября 2010

В C, если я объявляю struct / union / enum:

struct Foo { int i ... }

когда я хочу использовать свою структуру, мне нужно указать тег:

struct Foo foo;

Чтобы потерять это требование, я должен создать псевдоним своей структуры, используя typedef:

typedef struct Foo Foo;

Почему бы не иметь все типы / структуры / что угодно в одном и том же «пространстве имен» по умолчанию? Каково обоснование решения требовать тег объявления в каждом объявлении переменной (если только не typedefe'd) ???

Многие другие языки не делают этого различия, и кажется, что это только добавляет дополнительный уровень сложности ИМХО.

Ответы [ 3 ]

2 голосов
/ 11 октября 2010

Структуры / записи были очень ранним дополнением до C к B, сразу после того, как Деннис Ритчи добавил базовую «типизированную» структуру.Я считаю, что оригинальный синтаксис struct не имел тега вообще, для каждой переменной, которую вы сделали анонимным struct:

struct {
    int  i;
    char a[5];
} s;

Позже, тег был добавлен для повторного использования структуры структуры,но на самом деле это не считалось настоящим «типом».Кроме того, удаление struct / union сделает невозможным синтаксический анализ:

/* is Foo a union or a struct? */
Foo { int i; double x; };
Foo s;

или нарушит синтаксис объявления ', имитирующий синтаксис выражения' , столь фундаментальный для C.

Я подозреваю, что typedef был добавлен намного позже, возможно, через несколько лет после «рождения» C.

Аргумент «C был языком самого высокого уровня в то время».не похоже на правду.Алгол-68 предшествует этому и имеет записи как надлежащие типы.То же самое относится и к Паскалю.

Если вы хотите узнать больше об истории C, вы можете найти "Развитие языка C" Ритчи интересное чтение.

0 голосов
/ 09 октября 2010

Интересный вопрос! Вот мои мысли.

Когда C был создан, существовала небольшая абстракция над языком ассемблера. Был ФОРТРАН, В и другие, но когда появился С, это был, пожалуй, язык самого высокого уровня. Его цель состояла в том, чтобы обеспечить функциональность и синтаксис, достаточно мощный для создания и поддержки операционной системы, и это было замечательно.

Подумайте, что в то время перенос системы на новую платформу означал переписывание и адаптацию компонентов к языку ассемблера платформы. С выпуском C это в конечном итоге привело к переносу компилятора C и перекомпиляции существующего кода.

Вероятно, в то время было то преимущество, что сам синтаксис языка заставлял вас различать типы, которые могли бы поместиться в регистр, и типы, которые не могли.

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

Мы окружены такими вещами. Я имею в виду, взгляните на свою клавиатуру: почему у нас есть клавиша PAUSE / BREAK? Я не думаю, что нажимал эту клавишу в течение многих лет.

Это наследие того времени, когда оно имело смысл.

0 голосов
/ 09 октября 2010

Ну, другие языки также обычно поддерживают пространства имен. С не.

Вероятно, это не причина, но имеет смысл иметь хотя бы это естественное пространство имен.

...