有没有办法检查宏的非数字值
Is there a way to check for non-numeric value of a macro
假设我有
#define Name Joe
有没有办法区分宏的不同值。以下不起作用,但你明白了
#if Name==Joe
// some code
#elif Name==Ben
// some alternative code
#endif
我想用它从相同的源代码生成各种目标文件。来源差异很小,因此可以很容易地进行宏观控制。宏将通过 -DName=Joe
编译器标志传入。另请注意,Name
将是一个实际的符号名称,因此我们不能使用基于 #define Joe 1
等的技巧
强制编辑 请注意,this similar question 实际上处理的是字符串值宏。此外,那里的答案没有帮助。接受的答案避免了问题(但没有解决问题),另一个答案在宏中使用 strcmp
,它依赖于扩展等
很确定您会发现仅在 c++ 中是做不到的,人们已经找到了一些工具链扩展的方法,但它不可移植。
另一个用户问类似的问题:Here
是的,这是可能的,但并不是那么美好。
举个例子;更改名称,它将打印正确的内容。您只需要提前为每个名称定义 TEST_FOR_Name
,给每个名称一个唯一的值。
#define TEST_FOR_Joe 1
#define TEST_FOR_Ben 2
#define DO_TEST(NAME1, NAME2) DO_TEST_impl(NAME1, NAME2)
#define DO_TEST_impl(NAME1, NAME2) TEST_FOR_ ## NAME1 == TEST_FOR_ ## NAME2
#define NAME Ben
#include <iostream>
int main() {
std::cout << "Hello!" << std::endl;
#if DO_TEST(NAME, Joe)
std::cout << "Joe Found!" << std::endl;
#elif DO_TEST(NAME, Ben)
std::cout << "Ben Found!" << std::endl;
#else
std::cout << "Neither found!" << std::endl;
#endif
}
基本思想是我们使用与每个名称关联的唯一数值构建令牌。如果找不到令牌的值,比较就会失败,否则它会确保数字相同。
假设我有
#define Name Joe
有没有办法区分宏的不同值。以下不起作用,但你明白了
#if Name==Joe
// some code
#elif Name==Ben
// some alternative code
#endif
我想用它从相同的源代码生成各种目标文件。来源差异很小,因此可以很容易地进行宏观控制。宏将通过 -DName=Joe
编译器标志传入。另请注意,Name
将是一个实际的符号名称,因此我们不能使用基于 #define Joe 1
等的技巧
强制编辑 请注意,this similar question 实际上处理的是字符串值宏。此外,那里的答案没有帮助。接受的答案避免了问题(但没有解决问题),另一个答案在宏中使用 strcmp
,它依赖于扩展等
很确定您会发现仅在 c++ 中是做不到的,人们已经找到了一些工具链扩展的方法,但它不可移植。 另一个用户问类似的问题:Here
是的,这是可能的,但并不是那么美好。
举个例子;更改名称,它将打印正确的内容。您只需要提前为每个名称定义 TEST_FOR_Name
,给每个名称一个唯一的值。
#define TEST_FOR_Joe 1
#define TEST_FOR_Ben 2
#define DO_TEST(NAME1, NAME2) DO_TEST_impl(NAME1, NAME2)
#define DO_TEST_impl(NAME1, NAME2) TEST_FOR_ ## NAME1 == TEST_FOR_ ## NAME2
#define NAME Ben
#include <iostream>
int main() {
std::cout << "Hello!" << std::endl;
#if DO_TEST(NAME, Joe)
std::cout << "Joe Found!" << std::endl;
#elif DO_TEST(NAME, Ben)
std::cout << "Ben Found!" << std::endl;
#else
std::cout << "Neither found!" << std::endl;
#endif
}
基本思想是我们使用与每个名称关联的唯一数值构建令牌。如果找不到令牌的值,比较就会失败,否则它会确保数字相同。