Я читаю «C++ primer plus». В главе 9 он говорит о различии между C++ и C при работе с константным модификатором:Определение констант в нескольких файлах
«В C++ (но не в C) модификатор const слегка изменяет классы хранения по умолчанию. В то время как глобальная переменная имеет внешнюю связь по по умолчанию, константные глобальные переменный имеет внутреннюю связь по умолчанию.
...
Если глобальная декларация Const имела внешнюю связь, как обычные переменные делать, это было бы ошибка, потому что вы можете определить глобальную переменную в одном файле только то, что только один файл может содержать объявление процедуры, а другие файлы должны предоставлять ссылочные объявления с использованием ключевых слов extern. "
Я пытался проверить это утверждение со следующей программой:
file.h:
using namespace std;
const char *constant = "Magic";
file1.cpp
#include <iostream>
#include "file.h"
extern void file2();
int main(){
cout << "constant = " << constant << endl;
file2();
}
file2.cpp
#include <iostream>
#include "file.h"
void file2(){
cout << "file2 constant = " << constant << endl;
}
Makefile:
CFLAGS = -Wall -g
INCLUDE = file.h
src = file2.cpp file1.cpp
all: $(src) $(INCLUDE)
g++ $(CFLAGS) -o file $(src)
clean:
rm -f file
Когда я сделать, я получаю следующее сообщение об ошибке:
g++ -Wall -g -o file file2.cpp file1.cpp
/tmp/ccdl16Tw.o:(.data+0x0): multiple definition of `constant'
/tmp/ccA3ZEHa.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
make: *** [all] Error 1
GCC версии 4.8.2
UPDATE:
Если я
char* const constant = "Magic";
Тогда make даст мне это предупреждение:
г ++ -Wall -g -o файл file2.cpp file1.cpp
In file included from file2.cpp:2:0:
file.h:3:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* const constant = "Magic";
^
In file included from file1.cpp:2:0:
file.h:3:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char* const constant = "Magic";
Вы пытались использовать 'extern const char * constant;' в заголовке и, например, 'const char * constant =" Magic ";' в одном из единиц перевода? Глобалы по-прежнему различаются при использовании за пределами 'class' /' struct' declaratons. –
@ πάνταῥεῖ Я думаю, что он означает, что 'const' должен иметь внутреннюю связь, поэтому компоновщик не должен жаловаться на дублирующие символы. – vsoftco
@vsoftco _ «Я думаю, что он означает, что' const' должен иметь внутреннюю связь »_, что, очевидно, неверно, если только указанный в' struct' или 'class' также' static' не имеет значений в C++, которые отличаются от с. –