假设我有
#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,它依赖于扩展等.
解决方法
是的,这是可能的,但并不是那么漂亮.
这是一个例子;更改NAME,它将打印正确的东西.您只需要提前为每个名称定义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 }