如果我使用类似这样的东西,有什么大不同?
void print_struct( void *ptr_to_struct )
代替:
void print_struct( struct data *ptr_to_struct )
我之所以这样问,是因为我陷入了我无法理解的东西中,并且为什么它不能通过以下方式起作用:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( struct data *ptr_to_struct )
{
struct data *ptr = ptr_to_struct;
printf("Name = %s\n", ptr->name );
}
我得到:
error: ‘struct data’ declared inside parameter list will not be visible outside of this definition or declaration [-Werror]
但是如果我移动:
void print_struct( struct data *ptr_to_struct );
之后:
struct data{
char name[ 256 ];
};
编译正常。
我不明白的是:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void print_struct( void *ptr_to_struct );
struct data{
char name[ 256 ];
};
//void print_struct( void *ptr_to_struct );
int main( void )
{
struct data ptr;
strcpy ( ptr.name, "George" );
print_struct_1( &ptr);
}
void print_struct( void *ptr_to_struct )
{
struct data *ptr = ( struct data * )ptr_to_struct;
printf("Name = %s\n", ptr->name );
}
如果使用,则不行:
void print_struct( void *ptr_to_struct );
之前或之后:
struct data{
char name[ 256 ];
};
程序运行正常。
为什么会有这种区别?
答案 0 :(得分:1)
在函数原型中引用未知的struct something
类型时,它将有效地声明新的结构类型。但是,新类型将是该原型的本地类型。新类型将与之后声明的任何相同名称struct something
类型无关。例如
void foo(struct S *p) {}
struct S { int i; };
int main(void) {
struct S s;
foo(&s); // ERROR: the pointer types are unrelated
}
基本上,不要那样做。不要在函数原型中使用未知的struct something
类型。这是没有意义的。实际上,它始终是错别字或其他错误的指示。这就是编译器发出警告的原因。
必须在原型之前声明此类结构类型。您可以重新排列声明(如您已经尝试过的)。或者您可以预先声明结构类型
struct data;
void print_struct( struct data *ptr_to_struct );
struct data{
char name[ 256 ];
};
这也将正常工作。
声明参数类型为void *
的函数原型,然后使用参数struct something *
类型定义相同的函数会导致未定义的行为,即使您的程序看起来“工作正常”。