我是新来的,我想要一些帮助。
我的代码
#define ASDF "548896"
这是否意味着ASDF可以用作数组?
ASDF[0 % sizeof(ASDF) ]
的输出是什么?
答案 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}相同}