Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macros 有没有办法检查宏的非数值_Macros_C Preprocessor_Preprocessor Directive - Fatal编程技术网

Macros 有没有办法检查宏的非数值

Macros 有没有办法检查宏的非数值,macros,c-preprocessor,preprocessor-directive,Macros,C Preprocessor,Preprocessor Directive,如果我有 #define Name Joe 是否有办法区分宏的不同值。下面的方法不起作用,但你明白了 #if Name==Joe // some code #elif Name==Ben // some alternative code #endif 我想用它从相同的源代码生成不同的对象文件。源代码差别很小,因此可以很容易地进行宏观控制。宏将通过-DName=Joe编译器标志传入。还要注意,名称将是实际的符号名称,因此我们不能使用基于#define Joe 1等的技巧 强制编辑注释,

如果我有

#define Name Joe
是否有办法区分宏的不同值。下面的方法不起作用,但你明白了

#if   Name==Joe
// some code
#elif Name==Ben
// some alternative code
#endif

我想用它从相同的源代码生成不同的对象文件。源代码差别很小,因此可以很容易地进行宏观控制。宏将通过
-DName=Joe
编译器标志传入。还要注意,
名称
将是实际的符号名称,因此我们不能使用基于
#define Joe 1
等的技巧



强制编辑注释,实际处理字符串值宏。此外,那里的答案也没有帮助。可接受的答案避免了问题(但是没有解决),另一个答案使用了宏中的代码> STRCMP <代码>,它依赖于扩展,等等。

> P>你肯定会发现你不能在C++中找到一些工具链扩展的方法,但是它不是可移植的。


另一个用户问了类似的问题:

是的,这是可能的,但它并不那么漂亮

这里有一个例子;更改名称,它将打印正确的内容。您只需提前为每个名称定义
TEST\u,为每个名称指定一个唯一的值

#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
}
#为_1定义测试
#为2定义测试
#定义DO_测试(名称1,名称2)DO_测试(名称1,名称2)
#定义DO#u TEST_impl(NAME1,NAME2)TEST_FOR##NAME1==TEST_FOR##NAME2
#定义名称Ben
#包括
int main(){

std::你可能不想用这个(XY问题)而不是用一个值来定义名称,为什么不只是
#define Joe
,然后你可以检查
Joe
是否与
#if defined(Joe)
一起存在?数字:是的。名称:不太多。可能的重复(尽管这个问题只是关于C)@PCLuddite——一点也不重复;如果处理字符串,这类问题要复杂得多,但在这种情况下并不太难。@sergej:想象一下如果
Joe
Ben
是类型:
NAME var={3}
。如果
#定义名称Joe
@sergej:你假设
Joe
Ben
可以被定义为任意数字。如果这些符号相反有意义,或者已经是宏,那么你的简单方法就不起作用了。Charles的方法不管怎样都能起作用。这对定义的宏名称仍然有效吗通过编译器选项
-DName=Joe
?@undur\u gongor你完全正确!我错过了从
Name
Name
的更改。我也没有,但链接问题未被接受的答案中的“工具链扩展”是一个幻想。有关解释,请参阅该答案的第三条注释。