在C中使用define指令定义数组?

时间:2016-12-30 02:25:59

标签: c c-preprocessor

我是新来的,我想要一些帮助。

我的代码

#define ASDF "548896"

这是否意味着ASDF可以用作数组?

ASDF[0 % sizeof(ASDF) ]的输出是什么?

2 个答案:

答案 0 :(得分:3)

预处理器只是执行令牌替换,它没有详细说明数据类型。由于ASDF的扩展是一个字符串文字,因此它可以在允许字符串文字的任何地方使用,结果将与您编写文字本身完全相同。所以

ASDF[0 % sizeof(ASDF) ]

相当于

"548896"[0 % sizeof("548896")]

"548896"7(字符串中有6个字节,加上一个空终止符字节),所以这与

相同
"548896"[0 % 7]

由于0 % anything只是0,因此它等同于

"548896"[0]

这是字符'5'

我希望大多数编译器会在编译时执行所有这些转换,所以如果你编写原始表达式,它将被编译为好像你首先编写'5'一样。

答案 1 :(得分:0)

预处理概念上 C编译的前一阶段(甚至在编译器的解析阶段之前)。

因此,您应该考虑编译器正确获取预处理代码。在过去(20世纪80年代),预处理器甚至是一个不同的程序(/lib/cpp)。

今天,您仍然可以要求提供源代码mysource.i的预处理表单mysource.c,例如如果使用GCC编译器,则使用gcc -C -E mysource.c > mysource.i进行编译。

那么编译器(概念上)为您的示例解析的是:

 "548896"[0 % sizeof("548896")]

相当于"548896"[0 % (size_t)7],与"548896"[0]相同,可以简化为'5',在我使用UTF-8的Linux系统上,与{{1}相同}