【问题标题】:Quote macro for defining string用于定义字符串的引用宏
【发布时间】:2015-03-07 18:46:57
【问题描述】:

是否可以引用宏的“内容”? 类似于以下用于打印字符串“AAA”的代码。

#include <stdio.h>
#include <stdlib.h>

#define _L 5
#define _QUOTE(a) #a
#define _TEXT AAA
#define _STRINGAAA _QUOTE(_TEXT)

const char STRINGAAA[ _L ] = _STRINGAAA;

int main(void)
{
    printf( "%s\n", STRINGAAA );
    return EXIT_SUCCESS;
}

【问题讨论】:

  • 您应该避免使用以下划线字符开头的标识符,尤其是宏,因为它们是为实现而保留的。特别是,标识符_L 很可能与系统标头中的国际化宏发生冲突。当然,在您的示例中,最好一起省略数组长度的宏,只写 const char text[] = "AAA"; 并让编译器计算出所需的字节数。 (实际上是 4,而不是 5。)您稍后可以将其称为 sizeof(text)
  • ...实际上是 4,而不是 5...:那是因为我正在做的测试...
  • 我的意思不是它是 4 还是 5,而是编译器可以很容易地自己找出的硬编码东西充其量是浪费时间,最坏的情况是在您的程序中引入完全可以避免的。
  • 事实上这是你的观点之一。按照你的建议,我的程序最好写#define a_macro_name "aaa",然后写 const char a_const_char_name[] = a_macro_name;

标签: c c-preprocessor


【解决方案1】:

您需要在字符串化之前使用第二组宏来强制宏参数替换:

#include <stdio.h>
#include <stdlib.h>

#define _L 5
#define _XQUOTE(a) #a
#define _QUOTE(a) _XQUOTE(a)
#define _TEXT AAA
#define _STRINGAAA _QUOTE(_TEXT)

const char STRINGAAA[ _L ] = _STRINGAAA;

int main(void)
{
    printf( "%s\n", STRINGAAA );
    return EXIT_SUCCESS;
}

【讨论】:

  • 完美!!非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
相关资源
最近更新 更多