#define预处理指令疑问:添加单个字符修复数组声明错误
搞定这个#define的坑!
你遇到的问题完全是#define的“直男式”文本替换特性导致的——它只会机械地把string替换成char *,根本不会像typedef那样把它当成一个完整的类型来处理。
咱们来拆解一下问题:当你写了#define string char *,然后声明:
string a[] = {"I", "like", "to", "fight,"}, b[] = {"pinch", "and", "bight."};
预处理器会直接把它替换成:
char *a[] = {"I", "like", "to", "fight,"}, b[] = {"pinch", "and", "bight."};
这时候问题就来了!在C的声明规则里,char *a[], b[]等价于:
char *a[]; // 这是对的:a是一个存储char指针的数组,也就是字符串数组 char b[]; // 这就错了:b被当成了存储char的数组,和你初始化用的字符串字面量完全不匹配
这就是为什么b的声明不符合预期的原因。
只加一个字符的修复方案
很简单,在b的前面加一个*就行!修改后的代码声明部分变成:
string a[] = {"I", "like", "to", "fight,"}, *b[] = {"pinch", "and", "bight."};
预处理器展开后就会变成:
char *a[] = {"I", "like", "to", "fight,"}, *b[] = {"pinch", "and", "bight."};
这样a和b就都被正确声明为字符串数组了,代码自然就能正常输出啦。
额外小提示
如果想让#define的行为更接近typedef,其实可以把宏定义改成#define string char*(去掉空格),但这并不能解决你当前一行声明两个变量的问题——预处理器还是会把string a[], b[]替换成char* a[], b[],b依然会被当成char数组。所以最直接的还是给b加个*,这就是教材说的那个“仅添加一个字符”的巧妙解法。
内容的提问来源于stack exchange,提问作者Worice
相关产品推荐
相关产品推荐

