Подтвердить что ты не робот

Глобальная переменная связи 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 и С++?

4b9b3361

Ответ 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, чтобы избежать