Конфликт между глобальными переменными c / переполнение стека

Я использую два файла «.h», в которых есть 3 глобальные переменные с одинаковыми именами.

Мы предполагаем иметь эти файлы:

  • A.h => внутри него есть «union var1», «union var2» и «#define LENGTH 20».
  • B.h => внутри него есть «union var1», «union var2» и «#define LENGTH 60».
  • C.h => который импортирует как A.h, так и B.h.

Когда я компилирую C.h, у меня возникает причина конфликта для того же имени переменной.

Я не хочу изменять их имена, потому что они находятся в публичных библиотеках (я хотел бы использовать их такими, какие они есть!).
Это моя проблема.
Кто-нибудь может мне помочь? Благодарю.

1

Решение

Во-первых, файлы заголовков («.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;
1

Другие решения

Поместите на карантин каждую публичную библиотеку, чтобы вам не нужно было включать оба заголовочных файла в один отдельный файл. Файлы могут использовать одну библиотеку или другую, но не обе. Вам нужно будет создать обертки для нужной вам функциональности, оборачивая любую библиотеку, которую проще всего обернуть, и используя вашу обертку, а не непосредственно библиотеку, в коде, который использует другую библиотеку.

6

Попробуй это:

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"

Вам нужно отличить объявление от определения глобальных переменных.

0
По вопросам рекламы [email protected]