Глобальная переменная связи c & С++ по умолчанию, множественная задача определения и определения
Например:
code1.c/.cpp
int a;
// ... and so on
code2.c/.cpp
int a;
int main(void) {
return 0;
}
перейти к компиляции:
$gcc code1.c code2.c # this is fine
$
$g++ code1.cpp code2.cpp # this is dead
/tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a'
/tmp/ccnIOmPC.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
Есть ли какая-либо глобальная переменная, связывающая разницу между C и С++?
Ответы
Ответ 1
Это не строго законно. int a;
является предварительным определением в C. Вам разрешено несколько предварительных определений и не более одного непреднамеренного определения для каждой единицы перевода каждого объекта с внешней связью в C, но только одно определение для всех единиц перевода в программе.
Это широко распространенное расширение, позволяющее определять предварительные определения в нескольких единицах перевода в C, если не более одной единицы перевода содержит условное определение, но оно не является строго стандартным.
В С++ int a;
это просто определение - нет понятия условного - и все же незаконно иметь несколько определений объекта через единицы перевода программы.
В случае C вы можете посмотреть этот вопрос.
Ответ 2
Это незаконно в обоих, но компиляторы C обычно реализуют расширение. См. этот ответ.
Ответ 3
Существует три способа разрешения проблемы:
-
Если переменная a
одинакова в обоих файлах, вы должны объявить ее как extern
во всех файлах, кроме одного. extern
ключевое слово говорит компоновщику, что это имя находится в других файлах.
-
Вы можете использовать ключевое слово static
, чтобы ограничить область видимости переменной одним файлом. В котором он объявлен.
-
Или вы можете использовать безымянное пространство имен.
Ответ 4
g++ компилятор более строгий, чем gcc-компилятор.
Это также зависит от версии gcc, может быть более высокой версией gcc i.e 4.X и далее, она может дать такую же ошибку.
Используйте extern
, чтобы избежать