【问题标题】:Macro expansion and stringification: How to get the macro name (not its value) stringified using another macro?宏扩展和字符串化:如何使用另一个宏字符串化宏名称(而不是其值)?
【发布时间】:2012-07-27 18:02:57
【问题描述】:

出于兴趣:

#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 宏,如何在 const unsigned char [] 中获得 _ACD 字符串化。

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 macros


【解决方案1】:

(关于在没有充分理由的情况下不滥用 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;
}

【讨论】:

  • 完美答案。输出 _ADC。我今天学到了很多。谢谢
猜你喜欢
  • 2022-07-06
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多