Блок компиляции и проблема статической связи - PullRequest
2 голосов
/ 08 сентября 2011

Я собираюсь полностью перефразировать этот вопрос, так как я не совсем получаю решения, которые искал (они полезны, но они не говорили ничего, что другие вопросы, на которые я ссылался, не говорили).

Имеются следующие 4 файла:

файл № 1: А

class A { void a_func(); };

файл № 2: A.cpp

#include "A.h"

static int x = 4;

void A::a_func() {
    //implementation.
}

файл № 3:Bh

#include "A.h"
class B { void b_func(); };

file # 4: B.cpp

#include "B.h"

static int x = 3;

void B::b_func() {
    //implementation.
}

Вопрос № 1: Поскольку Bh включает в себя Ah, является ли A.cpp частью блока компиляции B?

Вопрос № 2: Будет ли ошибка, поскольку A.cpp и B.cpp оба объявляют одно и то же имя статической переменной (x)?Я слышал, что статические глобальные переменные имеют статическую связь, которая зависит от единицы перевода, но поскольку я не знал о вопросе № 1, это мне не сильно помогло.

Ответы [ 3 ]

3 голосов
/ 08 сентября 2011
  • Блок перевода состоит из всего, что выходит из препроцессора.В gcc попробуйте g++ -E myfile.cpp, чтобы увидеть, что это такое.

  • Статические глобалы имеют, ну, в общем, статическую связь, поэтому их имя не выходит за пределы TU.В каждом отдельном TU статический глобальный объект (с одинаковым именем или нет) будет отдельным объектом, локальным только для этого TU.

0 голосов
/ 08 сентября 2011

«Модуль компиляции» - это независимый источник, который может быть скомпилирован сам по себе.Каждый файл .cpp является единицей компиляции в сочетании с включенными в него файлами .h.Таким образом, комбинация a.cpp и ah - это одна единица компиляции, а b.cpp с bh и ah - другая единица компиляции.

Поскольку b.cpp не включает a.cpp, нет конфликта сстатическая переменная с одинаковым именем в каждом.

0 голосов
/ 08 сентября 2011

ответ № 1: абсолютно нет

ответ № 2: вообще никаких проблем.попробуй и сам увидишь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...