C 预处理器:串化多级类似函数的宏

C preprocessor: stringizing multiple levels of function-like macros

提问人:Jens Petersen 提问时间:11/16/2023 更新时间:11/16/2023 访问量:27

问:

我正在使用多个级别的宏,在这些宏中,我依赖于参数的字符串化。我自己的函数已经有相当多的参数,将它们串起来有效地使参数数量增加了一倍。不是世界末日,但我想知道是否有更好/更干净的方式来使用预处理器传递我需要的信息。

这是我自己的代码的基本版本。您可以看到,要通过宏传递宏的名称和数值,我需要为每个宏传递一个参数。

https://godbolt.org/z/eMvaa5rs1

#define ID_1                0x12340000 | 0x00005678
#define func2(val)          printf("func2 valname: %s, valstr: 0x%x\n", #val, val)
#define func3(val_str, val) printf("func3 valname: %s, valstr: 0x%x\n", val_str, val)

#define func1a(val) func2(val)
#define func1b(val) func3(#val, val)

#define FUNCTION(value) printf("Name: %s \nValue: %i", #value, value)

int main(void){
    func1a(ID_1);
    func1b(ID_1);
}

输出:

func2 valname: 0x12340000 | 0x00005678, valstr: 0x12345678
func3 valname: ID_1, valstr: 0x12345678

func3 的输出是我正在寻找的,但如果不传递两倍的参数,我似乎无法完成此操作。我认为这是唯一的方法,但我认为问问也无妨。

希望至少,这有助于某人了解使用字符串化参数时发生的情况。

谢谢!

C 函数 宏预 处理器 字符串化

评论

0赞 Jonathan Leffler 11/16/2023
我认为你已经尽可能简洁了——C 预处理器功能强大,但它不能做所有事情。

答: 暂无答案