Я прочитал существующие вопросы по внешним/внутренним связям здесь, на SO. Мой вопрос другой: что произойдет, если у меня есть несколько определений той же переменной с внешней связью в разных единицах перевода под C
и C++
?Разница в связи между C и C++?
Например:
/*file1.c*/
typedef struct foo {
int a;
int b;
int c;
} foo;
foo xyz;
/*file2.c*/
typedef struct abc {
double x;
} foo;
foo xyz;
Использование Dev-C++ и как программа C, выше программа компилируется и идеально; тогда как он дает множественную ошибку переопределения, если она скомпилирована как программа на C++. Почему он должен работать под C и какова разница с C++? Является ли это поведение неопределенным и зависит от компилятора? Как «плохо» этот код и что мне делать, если я хочу его реорганизовать (я столкнулся с большим количеством старого кода, написанного так)?
Поведение C может быть верным для вашей реализации, но язык не гарантируется. –
Имя переменной - это всего лишь метка для адреса памяти. Если вы даете два определения того, как интерпретировать этот ярлык, это не делает волшебным образом ярлык для обозначения двух разных объектов. Вы когда-нибудь видели компоновщика, который будет вести себя по-другому? –
Я не отрицаю, что это обычное поведение компоновщика, это поведение используется другими языками и многими реализациями C. Однако следствие вашего ответа состояло в том, что это четко определенное поведение. Разрешить более одного внешнего определения в программе является общим расширением, согласно стандарту C стандарта J, но даже с этим расширением, если определения не согласуются, это приводит к неопределенному поведению. –