不感兴趣:
#define _ACD 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS _ACD
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }
Run Code Online (Sandbox Code Playgroud)
仅使用DEFAULT_NETWORK_TOKEN_KEY_CLASS宏,如何在const unsigned char []中获取字符串化的_ACD.
const uint8 startMsg[] = ?? DEFAULT_NETWORK_TOKEN_KEY_CLASS ;
Run Code Online (Sandbox Code Playgroud)
只会导致_ACD.
在这里获取_ACD的正确宏扩展是什么?在如何将具有数组的宏字符串化为#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)
Run Code Online (Sandbox Code Playgroud)
但是,你会发现这还不够:
#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;
Run Code Online (Sandbox Code Playgroud)
在这里,STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)扩展为STRINGIFY0(5,5,5,30),并且C预处理器抱怨你给出了STRINGIFY0太多的参数.
解决方案是延迟扩展,_ACD因此它只会扩展到5,5,5,30您想要的时间.为此,请将其定义为类似函数的宏:
#define _ACD() 5, 5, 5, 30
Run Code Online (Sandbox Code Playgroud)
这样,_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;
}
Run Code Online (Sandbox Code Playgroud)