我正在#define
和typedef
练习。根据{{3}}有效的讨论,我认为我很好地掌握了这个问题。
目前,我正处于这个简单的代码块中:
#include <stdio.h>
/*typedef char *string; with typedef the code works correctly*/
#define string char *
int main(void){
string a[] = {"I", "like", "to", "fight,"},
b[] = {"pinch", "and", "bight."};
printf("%s %s %s %s %s %s %s\n",
a[0], a[1], a[2], a[3], b[0], b[1], b[2]);
return 0;
}
我知道define
给预处理器指示。在这种情况下,将string
替换为char *
。因此,a
被正确声明为char *a[]
,而b[]
则没有!
string b[] = {"pinch", "and", "bight."};
但我的this通过告知具有#define
的代码只能通过添加 一个单个字符来工作,从而向读者提出挑战。我一直无法找到解决方案。我只是为了好奇而向社区提出这个简单的问题。因此,提前感谢您的时间!
答案 0 :(得分:5)
这就是为什么你不应该使用宏,更换后你会得到:
char* a[] = {"I", "like", "to", "fight,"},
b[] = {"pinch", "and", "bight."};
其中a是指向字符的指针数组,b是字符数组。
这是宣言工作的方式,例如:
char* a, b;
a指向char b的指针是char,这样你就得写:
char* a, *b;
答案 1 :(得分:3)
预处理后,您的代码将如下所示:
char * a[] = {"I", "like", "to", "fight,"},
b[] = {"pinch", "and", "bight."};
通过这种方式,b
将是char
的数组。
解决问题:
string a[] = {"I", "like", "to", "fight,"},
*b[] = {"pinch", "and", "bight."};
^
You have to add an asterisk here.
答案 2 :(得分:2)
在*
之前添加b
会使代码生效,因为它会扩展为:
char *a[] = {"I", "like", "to", "fight,"},
*b[] = {"pinch", "and", "bight."};
当使用*
时,string
使用b
看起来像string
是一个typedef
指针数组,我会看起来完全混乱想象一下这个练习的重点:说明为什么使用宏作为一个穷人的{{1}}导致混乱。