gpt4 book ai didi

c - 宏扩展和字符串化 : How to get the macro name (not its value) stringified using another macro?

转载 作者:太空狗 更新时间:2023-10-29 17:10:09 24 4
gpt4 key购买 nike

出于兴趣:

#define _ACD 5, 5, 5, 30

#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD

#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }

仅使用 DEFAULT_NETWORK_TOKEN_KEY_CLASS 宏,如何将 _ACD 字符串化为 const unsigned char []。

const uint8 startMsg[] = ?? DEFAULT_NETWORK_TOKEN_KEY_CLASS ;

只会产生 _ACD

在此处获取 _ACD 的正确宏扩展是什么。在 How to stringify macro having array as #define a_macro {5,7,7,97}? 的背景下

最佳答案

(关于在没有充分理由的情况下不得滥用 C 预处理器的标准免责声明适用于此。)

当然可以做你想做的事。您需要一个 STRINGIFY 宏和一些宏间接寻址。

通常,STRINGIFY 定义了一个间接级别,以允许 C 预处理器在进行字符串化之前扩展其参数。一种实现是:

/* The # operator converts symbol 'v' into a string */
#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)

但是,您会发现这还不够:

#define _ACD 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }

#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
const char startMsg[] = START_MSG;

此处,STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS) 扩展为 STRINGIFY0(5,5,5,30),C 预处理器提示您已给 STRINGIFY0 参数太多。

解决方案是延迟 _ACD 的扩展,这样它只会在您需要时扩展到 5,5,5,30。为此,将其定义为类似函数的宏:

#define _ACD() 5, 5, 5, 30

这样,_ACD 只会在您“调用”它时展开:_ACD()DEFAULT_NETWORK_TOKEN_KEY_CLASS 现在将扩展为 _ACD,您必须通过“调用”它来进一步扩展它:DEFAULT_NETWORK_TOKEN_KEY_CLASS()

下面的代码说明了解决方案:

#include <stdio.h>

#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)

#define _ACD() 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS() }

#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)

const char startMsg[] = START_MSG;

int main(int argc, char** argv)
{
printf("%s\n",startMsg);
return 0;
}

关于c - 宏扩展和字符串化 : How to get the macro name (not its value) stringified using another macro?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11693219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com