Я использую два файла «.h», в которых есть 3 глобальные переменные с одинаковыми именами.
Мы предполагаем иметь эти файлы:
Когда я компилирую C.h, у меня возникает причина конфликта для того же имени переменной.
Я не хочу изменять их имена, потому что они находятся в публичных библиотеках (я хотел бы использовать их такими, какие они есть!).
Это моя проблема.
Кто-нибудь может мне помочь? Благодарю.
Во-первых, файлы заголовков («.h»), строго говоря, никогда не компилируются, поэтому такой вещи, как When I compile C.h
, Только .cpp
файлы, которые, конечно, включают эти заголовочные файлы компилируются.
Во-вторых, если вашей программе нужно включить два заголовочных файла, которые ссылаются на разные переменные с одинаковыми именами, то у вас, вероятно, есть проблема с плохим дизайном.
В-третьих, я думаю (?, Не используйте союзы очень часто …), что вам нужно определить имя для объединения.
В противном случае решение может состоять в том, чтобы определить разные пространства имен, чтобы различать два:
// A.h
namespace aa {
union myType { int m1; float m2; }
myType var1;
}
.
// B.h
namespace bb {
union myType { int m1; float m2; }
myType var1;
}
.
// C.cpp
#include "A.h"#include "B.h"
...
aa::var1.m1 = 1;
bb::var1.m1 = 2;
Поместите на карантин каждую публичную библиотеку, чтобы вам не нужно было включать оба заголовочных файла в один отдельный файл. Файлы могут использовать одну библиотеку или другую, но не обе. Вам нужно будет создать обертки для нужной вам функциональности, оборачивая любую библиотеку, которую проще всего обернуть, и используя вашу обертку, а не непосредственно библиотеку, в коде, который использует другую библиотеку.
Попробуй это:
LIB_FILE.H
extern union_type var1; // declaration
extern union_type var2; // declaration
LIB_FILE.cpp
union_type var1; // definition
union_type var2; // definition
ФАЙЛ А.Х
#include "LIB_FILE.H"
ФАЙЛ Б.Х.
#include "LIB_FILE.H"
FILE C.H
#include "A.H"#include "B.H"
Вам нужно отличить объявление от определения глобальных переменных.