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

宏 – 有没有办法检查宏的非数字值,第1张

概述假设我有 #define Name Joe 有没有办法区分宏的不同值.以下不起作用,但你明白了 #if Name==Joe// some code#elif Name==Ben// some alternative code#endif 我想用它来生成来自相同源代码的各种目标文件.源差异很小,因此可以很容易地进行宏观控制.宏将通过-DName = Joe编译器标志传入.另请注意,Nam 假设我有
#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}

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

总结

以上是内存溢出为你收集整理的宏 – 有没有办法检查宏的非数字值全部内容,希望文章能够帮你解决宏 – 有没有办法检查宏的非数字值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241274.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存