宏 – 有没有办法检查宏的非数字值

假设我有
#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
}

基本思想是我们使用与每个名称相关联的唯一数值构建标记.如果它找不到令牌的值,则比较失败,但是否则确保数字相同.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...