Мне нужно создать такую структуру:
// file main.h:
#pragma once
#ifndef _MAIN_H
#define _MAIN_H
#include <iostream>
#include "first.h"
#include "second.h"
#endif
// -----------------
// file first.h:
#pragma once
#ifndef _FIRST_H
#define _FIRST_H
#include "main.h" // because of using SomeFunction() in first.cpp
int SomeVar; // used in first.cpp
#endif
// -----------------
// file second.h:
#pragma once
#ifndef _SECOND_H
#define _SECOND_H
#include "main.h" // because of using SomeVar in second.cpp
int SomeFunction(); // implemented in second.cpp
#endif
// -----------------
По логике, если main.h
будет скомпилирован первым, то каждый из этих заголовков будет включен только один раз, и все переменные / функции будут определены нормально.
Например, эта конфигурация обычно компилируется в компиляторе IAR C ++, если для параметров «preinclude file» (not precompiled) задано main.h
.
Но в Visual Studio 2010 такая же структура вызывает ошибки компоновщика, такие как:
1>second.obj : error LNK2005: "int SomeVar" (?SomeVar@@3HA) already defined in first.obj
1>second.obj : error LNK2005: "int SomeFunction" (?SomeFunction@@3HA) already defined in first.obj
Я думаю, из-за включения файлов в алфавитном порядке. По-видимому, компоновщик игнорирует pragma- и define-guards.
Ошибки могут быть исправлены с помощью дополнительного определения заголовка и external
переменных, но это сложный и неправильный путь.
Вопрос: что мне делать?