Бьерн Страуструп.
Язык программирования С++
99
глобальных классов и перечислений должны быть уникальными во всей программе и иметь
единственное определение. Поэтому, если есть два даже идентичных определения одного класса, это -
все равно ошибка:
// file1.c:
struct S { int a; char b; };
extern void f(S*);
// file2.c:
struct S { int a; char b; };
void f(S* p) { /* ... */ }
Но будьте осторожны: опознать идентичность двух описаний класса не в состоянии большинство
систем программирования С++. Такое дублирование может вызвать довольно тонкие ошибки (ведь
классы в разных файлах будут считаться различными).
Глобальные функции-подстановки подлежат внутреннему связыванию, и то же по умолчанию
справедливо для констант. Синонимы типов, т.е. имена typedef, локальны в своем файле, поэтому
описания в двух данных ниже файлах не противоречат друг другу:
// file1.c:
typedef int T;
const int a = 7;
inline T f(int i) { return i+a; }
// file2.c:
typedef void T;
const int a = 8;
inline T f(double d) { cout<
Константа может получить внешнее связывание только с помощью явного описания:
// file3.c:
extern const int a;
const int a = 77;
// file4.c:
extern const int a;
void g() { cout<
В этом примере g() напечатает 77.
Достарыңызбен бөлісу: