2010-06-22 2 views
1

foo.cДубликат определение структуры в другом исходном файле

struct foo { 
    int a; 
}; 

bar.c 

struct foo { 
    char *s; 
    double x,y; 
}; 

структура определения только в .c файлов. Является ли это законным в соответствии со стандартом C? Какая часть стандарта так говорит? Редактирование: нет определения включения определения структуры.

Спасибо вам за быстрый ответ! : D

ответ

6

Код вполне легальный C. У вас могут возникнуть проблемы с отладчиками (ошибка одного типа для другого и попытка отобразить один как другой), но это прекрасно с точки зрения языка.

Нет стандарта, который бы прямо сказал, что это законно. Скорее, нет части стандарта, который говорит, что это незаконно.

Что-то вроде этого было бы незаконным в C++, поскольку C++ расширяет понятие linkage классам и нелокальным в классах C++ всегда имеет внешнюю связь.

+0

Не уверен в этом втором абзаце. Там ничего нет, говоря, что я не могу сложить слонов в моем коде;) – sje397

+0

@ sje397: Да, но стандарт даже не вводит понятие «слон». Что касается типов структур - они существуют в стандарте, а правила объявления для структур также описаны в стандарте. В стандарте указано, что необходимо сделать, чтобы использовать типы структуры в программе, и пока эти требования соблюдены, вы в порядке. – AnT

+0

В принципе, это похоже на вопрос, является ли законным назвать ваш тип структуры как 'Abcdef'. Как бы вы ответили на такой вопрос? Если вы просто скажете «да», тогда следующий вопрос будет о 'Dgefht' как имя типа структуры. Это нормально? И так далее ... Итак, когда дело доходит до таких вопросов, правильный ответ заключается в том, что, если стандарт не запрещает такой идентификатор, то это нормально использовать. То же самое с объявлением структуры в исходном вопросе. – AnT

6

Раздел 6.2.1-4 стандарта C99 указывает, что он является законным, поскольку оба объявлены в разных областях (каждый из которых имеет объем файла, простирающийся от их определения до конца блока перевода, то есть файла).

+0

Но связь говорит о том, что для обозначения одного и того же объекта могут быть сделаны два идентификатора из разных областей. Разве они не будут иметь внешнюю связь в этом случае? –

+0

Я прочитал 6.2.2-6, чтобы указать, что по умолчанию структуры не имеют привязки (структура не является объектом) – sje397

+1

@Owen S: На языке C понятие * linkage * не относится к * type *. В C-ссылке применяется только к объектам или функциям. – AnT

Смежные вопросы