(void *)用法用作函数参数,而不是struct *

时间:2018-11-20 19:16:29

标签: c

如果我使用类似这样的东西,有什么大不同?

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 ];
};

程序运行正常。

为什么会有这种区别?

1 个答案:

答案 0 :(得分:1)

  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 ];
    };
    

    这也将正常工作。

  2. 声明参数类型为void *的函数原型,然后使用参数struct something *类型定义相同的函数会导致未定义的行为,即使您的程序看起来“工作正常”。