如何将一个宏扩展为另一个宏的参数名称

问题描述 投票:0回答:1

例如:

#define Y (b * 2)
#define X(b) Y

int main()
{
    printf("%d", X(4)); // Want it to print 8, but doesn't work
}

C 宏可以实现类似的功能吗?

c macros c-preprocessor
1个回答
0
投票

如注释中所述,宏参数名称对于特定的类似函数的宏具有本地作用域,因此您无法从宏外部访问它。

类似的事情也可以通过称为“X 宏”的设计模式实现。它基于在宏中提供数据列表(或单个项目),而不是让该列表宏采用不同的宏作为参数,以便将某些内容应用于数据列表。

示例:

#include <stdio.h>

// here X will an external function-like macro with 1 parameter:
#define LIST(X) \
  X(4)          \
  X(8)

// some macros with 1 parameter that should print and possibly also multiplicate
#define PRINTx1(a) printf("%d ", (a));  // note the semicolon here
#define PRINTx2(a) printf("%d ", (a)*2);

int main (void)
{
  LIST(PRINTx1)  // note the lack of semicolon here
  puts("");
  LIST(PRINTx2)
}

输出:

4 8 
8 16 

以上所有内容都会像这样展开:

PRINTx1(4) PRINTx1(8)
puts("");
PRINTx2(4) PRINTx2(8)

->

printf("%d ", (4)); printf("%d ", (8));
puts("");
printf("%d ", (4)*2); printf("%d ", (8)*2);
© www.soinside.com 2019 - 2024. All rights reserved.