使用#define对预处理程序指令的好奇心

时间:2018-05-12 15:25:32

标签: c

我正在#definetypedef练习。根据{{​​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的代码只能通过添加 一个单个字符来工作,从而向读者提出挑战。我一直无法找到解决方案。我只是为了好奇而向社区提出这个简单的问题。因此,提前感谢您的时间!

3 个答案:

答案 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}}导致混乱。