c - 尝试在结构中使用 typedef:为什么我会收到错误,首先这是一个好主意吗?



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

错误:"typedef"之前的预期说明符限定符列表

我最初的目的是测试typedef的作用域是否包含在结构中。这样,如果此标头要包含在另一个源文件中,我可以防止不必要地使用此别名。如果我将有问题的行(以"typedef"开头的行)移到结构体之外和之前,代码就会编译。

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

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

#ifndef STUDENT_H
#define STUDENT_H
typedef struct{
typedef char* string;
string name;
int id;
} Student;
#endif

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

错误:"typedef"之前的预期说明符限定符列表

您不能在typedef内有typedef

您可以拥有:

typedef char* string;

然后使用它:

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

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


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

这就是C一直以来的工作方式,每个人都很好。你必须学会接受这个"限制"。

与C++ C相反是非常受限制的语言。在结构中,数据成员可能没有存储类说明符(typedefexternstatic_Thread_localautoregister),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 ) = '';
//  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

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

相关内容

  • 没有找到相关文章

最新更新