Когда я объявляю глобальную переменную в двух разных исходных файлах и определяю ее только в одном из исходных файлов, я получаю различные компиляции результатов для C++, чем для C. См. Следующий пример:
main.c
#include <stdio.h>
#include "func.h" // only contains declaration of void print();
int def_var = 10;
int main() {
printf("%d\n", def_var);
return 0;
}
func.c
#include <stdio.h>
#include "func.h"
/* extern */int def_var; // extern needed for C++ but not for C?
void print() {
printf("%d\n", def_var);
}
Я компилирую следующие команды:
gcc/g++ -c main.c -o main.o
gcc/g++ -c func.c -o func.o
gcc/g++ main.o func.o -o main
g++/clan g++ жалуются на multiple definition of def_var
(это поведение, которое я ожидал, когда не использовал extern). gcc/clang компилируется просто отлично. (с использованием gcc 7.3.1 и clang 5.0)
Согласно этой ссылке:
Предварительное определение - это объявление, которое может или не может выступать в качестве определения. Если фактическое внешнее определение найдено раньше или позже в той же самой системе перевода, то предварительное определение просто действует как декларация.
Поэтому моя переменная def_var
должна быть определена в конце каждой единицы перевода, а затем приводить к нескольким определениям (как это сделано для C++). Почему это не так при компиляции с gcc/clang?