尝试从头文件的结构中通过"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相反是非常受限制的语言。在结构中,数据成员可能没有存储类说明符(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 ) = ' ';
// 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
会让代码的读者感到困惑。