【发布时间】: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