0

尝试从头文件的结构中通过“typedef”声明别名时出现此错误:

错误:'typedef'之前的预期说明符限定符列表</p>

我最初的意图是测试 typedef 的范围是否包含在结构中。这是为了防止在此标头包含在另一个源文件中时不必要地使用此别名。如果我将违规行(以'typedef'开头的行)移到结构之外和之前,代码将编译。

但是,我不明白为什么我不能从结构中调用 typedef,以及为什么我会得到上述错误。

此外,我不确定这种做法是否真的有必要。如果有的话,限制别名有什么好处?

#ifndef STUDENT_H
#define STUDENT_H

typedef struct{

    typedef char* string;
    string name;
    int id;

} Student;

#endif

我希望代码能够编译,但我收到了错误消息:

错误:'typedef'之前的预期说明符限定符列表</p>

4

2 回答 2

6

你不能有一个typedef内部 a typedef

你可以有:

typedef char* string;

然后使用它:

typedef struct{
    string name;
    int id;
} Student;

请注意,这string只是一个指针,它必须“指向”分配的内存,然后才能使用它(尤其是在写入它之前)。


但是,我不明白为什么我不能从结构中调用 typedef

从那时起,C 就是这样工作的,每个人都很好。你必须学会​​接受这个“限制”。

于 2019-07-12T10:36:03.283 回答
3

与 C++ 相反,C 是非常受限制的语言。在结构中,数据成员可能没有存储类说明符(typedef, extern, static, _Thread_local, auto, register),typedef如您所见,在 C 中被视为存储类说明符。

您可以将 typedef 放在结构定义之前,例如

typedef char* string;

typedef struct{
    string name;
    int id;
} Student;

并在整个程序中使用 typedef。

但要考虑到,如果你会写例如

const string s = "Hello Aiman";

这并不意味着相同

const char * s = "Hello Aiman";

这确实意味着

char * const s = "Hello Aiman";

也就是说,指针指向的字符串文字不是常量。指针本身是不变的。

考虑以下演示程序

#include <stdio.h>

typedef char * string;

void f( const string s )
{
    *s = 'B';
    *( s + 1 ) = 'y';
    *( s + 2 ) = 'e';
    *( s + 3 ) = '\0';

    //  The statement below issues compilation error
    //  "assignment of read-only parameter 's'"
    //  s = "Hello";
}

int main( void )
{
    char s[] = "Hello";

    puts( s );

    f( s );

    puts( s );
}

它的输出是

Hello
Bye

也就是说,在函数内,指针指向的字符串s可以更改,但指针本身不能更改。

所以也许最好不要引入这样的 typedef,因为在声明中使用这样的 typedef

const string s

会使代码的读者感到困惑。

于 2019-07-12T13:15:39.127 回答