Кто-нибудь может объяснить эту часть проекта стандарта C ++ 0x? - PullRequest
3 голосов
/ 25 марта 2011

Из стандарта ISO: & sect; 3.0/9:

n3234 говорит:

Имя, используемое в нескольких единицах перевода, потенциально может относиться к один и тот же объект в этих переводческих единицах в зависимости от связи (3.5) имя, указанное в каждой единице перевода.

Может кто-нибудь объяснить этот вопрос примером, пожалуйста?

Что на самом деле говорит это утверждение? Может ли кто-нибудь доказать это с точки зрения программы?

Ответы [ 2 ]

7 голосов
/ 25 марта 2011

Конечно!Это говорит о том, что если у вас есть несколько исходных файлов (единиц перевода), которые оба используют какое-то имя (например, имя переменной, класса или функции), то возможно, что эти разные файлы говорят об одной и той же переменной,class, или function, предполагая, что эта сущность была объявлена ​​таким образом, чтобы она была видна в разных файлах (то есть в зависимости от его связи).

Например, если у меня есть этот файл:

A.cpp:

int globalInt;

int main() {
     globalInt = 137;
}

И вот этот:

B.cpp:

extern int globalInt;

void foo() {
    globalInt = 42;
}

Тогда в обоих файлах имя globalInt относитсяк глобальной int переменной globalInt, определенной в A.cpp.Это все, что говорит этот пункт.

Обратите внимание, однако, что если я объявлю globalInt без внешней связи, то оба файла будут говорить о разных переменных.Например, в этом случае:

C.cpp:

static int globalInt;

int main() {
     globalInt = 137;
}

D.cpp:

static int globalInt;

void foo() {
    globalInt = 42;
}

Теперь переменная globalInt указана в C.cpp не такое же, как в D.cpp, даже если они имеют одно и то же имя.

Надеюсь, это поможет!

0 голосов
/ 25 марта 2011

Ах, стандарты ... давайте запутать очевидное.

Это говорит о том, что, если вы используете глобальную переменную с одинаковым именем в двух разных исходных файлах, они будут одинаковыми, если они extern или вообще не указаны, но если объявлена ​​какая-либо из них static тогда они будут полностью независимы, потому что они видны только в этом исходном файле.

int a;        // can be seen in other files; this may be duplicated in multiple source files
static int b; // can only be used in this file
extern int c; // explicitly using a visible variable "c" defined in another file

("Linkage" - это глобальный static / extern / default, или auto, который почти никогда не упоминается, поскольку он означает "размещенный в стеке", который является значением по умолчанию для переменных, объявленных внутри функции и очевидно, не имеет смысла для объявления вне функции. «Стандартные единицы» - это обычный способ для стандартов избегать упоминания «файлов».)

...