在另一个#define中使用#define的参数名称

时间:2015-07-27 12:12:49

标签: c c-preprocessor

有没有办法将stdClass::__set_state(array('a' => 1,)) stdClass::__set_state(array('a' => 1,)) 参数的名称用作另一个#define参数?例如:

#define

结果如何:

#define TEST 1

#define FOO(X) foo_##X

#define BAR(X) FOO(##X)

BAR(TEST)

foo_TEST

这不起作用,因为它给出了:

foo_1

2 个答案:

答案 0 :(得分:2)

删除BAR marco中的双重'#'。

参见工作示例: http://ideone.com/hEhkKn

#include <stdio.h>

#define FOO(X) foo_##X

#define BAR(X) FOO(X)


int main(void) {

    int BAR(hello);
    return 0;
}

关于您更新的问题:

如果您想使用像'TEST'这样的已定义名称,请将代码更改为 #define TEST TEST

#include <stdio.h>

#define TEST TEST    
#define FOO(X) foo_##X    
#define BAR(X) FOO(X)

int BAR(TEST) (int v) {
    return v;
}

int main(void) {
    return foo_TEST(0);
}

答案 1 :(得分:1)

只有两种方法可以避免评估宏参数。在其上使用#(stringize)处理运算符或##(标记粘贴)运算符。

尝试以下方法:

#include <stdio.h>

#define TEST 1

#define FOO(X) foo ## X
#define BAR(X) FOO(_ ## X) // Prevent the evaluation of X with ##

void foo_1()
{
    printf("%s\n", __FUNCTION__);
}

void foo_TEST()
{
    printf("%s\n", __FUNCTION__);
}

int main()
{
    BAR(TEST)();
    return 0;
}