Я наткнулся на устаревший код, который не может быть построен на более новом компиляторе. Свернутый пример:
int x;
extern "C" { int x }; // conflicts with C++ linkage above
// note: without the braces it would've been equivalent to:
// extern "C" { extern int x; }
//
// for reference, see the notes section here:
// http://en.cppreference.com/w/cpp/language/language_linkage#notes
Старые компиляторы не помечали это, но и gcc (начиная с 4.1.2), и clang помечают это.
Вывод Clang:
error: declaration of 'x' has different language linkage
Вывод GCC:
error: previous declaration of 'int x' with 'C++' linkage
error: conflicts with new declaration with 'C' linkage
Это меня удивило, потому что компилятор не искажает x
каким-либо особым образом, и, насколько я могу судить, в объектном файле нет ничего другого, кроме отладочной информации (на основе моего, по общему признанию, неглубокого теста с objdump/readelf)
Мой вопрос: почему это ошибка, если функциональной разницы нет?
Кстати, я не против изменить код; Я хотел знать, происходит ли что-то большее, чем просто «стандарт говорит, что это неправильно».