c++ - 如何比较两个同名的预处理器宏?
问题描述
我有一个项目,其中有两个具有相同名称的不同预处理器宏,在两个不同的包含文件(来自两个不同的库)中定义,我必须在构建时检查它们是否具有相同的值。
到目前为止,我可以在运行时进行此检查,将宏值分配给不同实现文件中的不同变量,每个变量只包含一个所涉及的头文件。
我怎样才能在构建时做到这一点?
这是我到目前为止所尝试的(其中 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
宏1.h:
#ifndef MACRO1_H
#define MACRO1_H
#define MY_MACRO 123
#endif // MACRO1_H
宏2.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 的解决方案感兴趣。
解决方案
包括第一个标题。然后将宏的值保存到constexpr
变量中:
constexpr auto foo = MY_MACRO;
然后包括第二个标题。它应该默默地覆盖MY_MACRO
. 如果您的编译器开始抱怨,#undef MY_MACRO
请先做。
然后使用 a 将宏的新值与变量进行比较static_assert
:
static_assert(foo == MY_MACRO, "whatever");
推荐阅读
- php - 如何在图表js laravel 7中的标签和数据中传递数组
- python - Flask/Jinja2 渲染多个集合
- google-bigquery - 谷歌 BigQuery SQL -
- c# - 如何从后面代码中的列表框中查询复选框?
- c++ - Traversing trees at compile time with C++17 Variadic Templates
- include - 在 PJSIP 中包含 Codec2
- dataframe - Spark:如何按列对数据框进行分组
- ios - 使视野从周围环境中脱颖而出。反色边框层?
- c++ - 重载_grade_program_accelerated_c++_book
- flutter - 为什么我的文本在 Flutter Web Mobile 中不能正确换行?