Переопределение статической переменной в Visual C ++ - PullRequest
0 голосов
/ 14 июня 2019

У меня есть 2 файла, каждый из которых содержит статическую переменную int с таким же именем:

test-1.cpp:

#include "test-2.cpp"

static int a;

int main() {

}

test-2.cpp:

static int a;

void fonction() {

}

Когда я компилирую с cl test-1.cpp в командной строке, я получаю эту ошибку:

test-1.cpp(3): error C2086: 'int a' : redefinition

Ответы [ 3 ]

4 голосов
/ 14 июня 2019

Поскольку вы включаете test2.cpp в test-1.cpp, фактический код, который видит компилятор, выглядит так:

static int a;

void fonction() {

}

static int a;

int main() {

}

Отсюда и переопределение.

Команда препроцессора #include включает файл в текстовом формате.

В действительности вы хотите, чтобы оба файла test-1.cpp и test-2.cpp были включены в проект Visual Studio.

Youхочу это:

test-1.cpp

#include "test-2.h"

static int a;

int main() {
  fonction();
}

test-2.cpp

#include "test-2.h"

static int a;

void fonction() {

}

test-2.h

void fonction();
3 голосов
/ 14 июня 2019

Конечно, вы #including test-2.cpp в test-1.cpp. Это как если бы у вас был только один файл. Если вы удалите #include и выполните эту команду

cl test-1.cpp test-2.cpp

тогда будет работать.

Вся эта область называется отдельной компиляцией , и это то, с чем борются новички (к тому же это не часто преподается очень хорошо). Из-за отдельной компиляции вы не должны никогда включать один файл cpp в другой файл cpp. Вместо этого вы должны передать оба файла компилятору, чтобы они могли быть скомпилированы отдельно.

Если один файл cpp должен знать, что определено в другом файле cpp, создайте заголовочный файл с объявлениями того, что находится во втором файле cpp, и включите его в первый файл cpp.

1 голос
/ 14 июня 2019

В этой строке;

#include "test-2.cpp"

вы говорите препроцессору поместить содержимое test-2.cpp в test-1.cpp. Следовательно, вы определяете static int a; дважды. Это не разрешено Чтобы это исправить, удалите #include.

Обратите внимание, что вам необходимо тщательно различать объявления (которые могут встречаться много раз) и определения (которые могут встречаться только один раз). Посмотрите эту тему для получения дополнительной информации.

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