У меня есть проект, в котором есть два разных макроса препроцессора с одинаковым именем, определенных в двух разных включаемых файлах (из двух разных библиотек), и я должен проверить, имеют ли они одно и то же значение во время сборки.
До сих пор я мог выполнять эту проверку во время выполнения, назначая значения макросов различным переменным в разных файлах реализации, каждый из которых включает только один из задействованных заголовков.
Как я могу сделать это во время сборки?
Это то, что я пробовал до сих пор (где Macro1.h и Macro2.h - сторонние файлы, которые я не могу изменить):
Заголовочные файлы:
TestMultiMacros.h:
#ifndef TEST_MULTI_MACROS_H
#define TEST_MULTI_MACROS_H
struct Values
{
static const unsigned int val1, val2;
static const unsigned int c1 = 123, c2 = 123;
};
#endif // TEST_MULTI_MACROS_H
Macro1.h:
#ifndef MACRO1_H
#define MACRO1_H
#define MY_MACRO 123
#endif // MACRO1_H
Macro2.h:
#ifndef MACRO2_H
#define MACRO2_H
#define MY_MACRO 123
#endif // MACRO2_H
Файлы реализации:
TestMultiMacros1. cpp:
#include "TestMultiMacros.h"
#include "Macro1.h"
const unsigned int Values::val1 = MY_MACRO;
TestMultiMacros2. cpp:
#include "TestMultiMacros.h"
#include "Macro2.h"
const unsigned int Values::val2 = MY_MACRO;
точка входа. cpp:
#include "TestMultiMacros.h"
using namespace std;
static_assert(Values::val1 == Values::val2, "OK"); // error: expression did not evaluate to a constant
static_assert(Values::c1 == Values::c2, "OK");
int main()
{
}
Мне было бы интересно найти решение с использованием C ++ 11 и C ++ 17.