如何在 C 函数中共享结构? (我收到警告:预期 'struct <anonymous> **')

How to share struct within functions in C? (I got warnings: expected 'struct <anonymous> **')

我不明白为什么会这样。我可以调用 read_png_file() 并且 *data 在那里(如果我设置了任何值,我可以看到设置的值)。但是当我调用下一个函数时,那里没有数据,但它是类型 (PNGDataPtr *) 0x22ff24 指的是 (PNGDataPtr) 0x77c02850 你能解释一下那里发生了什么以及它是如何正确的吗?我想传递结构并在函数之间共享它。

#include <stdio.h>
#include <stdlib.h>
#include <png.h>

typedef struct
{
    FILE *fp;
} PNGData, *PNGDataPtr;


void read_png_file(char* file_name, PNGData * data)
{
}

void write_png_file(char* file_name, PNGDataPtr * data)
{
}

void process_file(PNGDataPtr * data)
{
}

int main(int argc, char **argv)
{
    PNGData data;
    read_png_file(argv[1], &data);
    process_file(&data);
    write_png_file(argv[2], &data);
    return 0;
}

function 'main':|
warning: passing argument 1 of 'process_file' from incompatible pointer type
main.c|19|note: expected 'struct **' but argument is of type 'struct PNGData *'|
warning: passing argument 2 of 'write_png_file' from incompatible pointer type [enabled by default]|
15|note: expected 'struct **' but argument is of type 'struct PNGData *'|

在 write_png_file 和 process_file 的声明中删除 *。您已经将 PNGDataPtr 声明为指针。保留当前的习语,您应该将声明更改为以下内容:

void write_png_file(char* file_name, PNGDataPtr data)
void process_file(PNGDataPtr data)

我假设这是您实际系统的代码片段;但是在 C 语言中我们惯用地避免 typedefing 纯粹是为了将某物标记为指向它的非 Ptr 对应物的指针。也有例外,例如为其他人构建 API 和图书馆,您希望在其中隐藏底层细节。我建议对结构声明进行以下更改以使其更加惯用:

typedef struct png_data_t
{
    FILE *fp;
} PNGData;

命名结构将提供更好的编译器诊断和错误消息。并对您的方法声明进行以下更改:

void write_png_file(char* file_name, PNGData * data) { }
void process_file(PNGData * data) { }

您的主要方法应该不需要修改。

这个:

void read_png_file(char* file_name, PNGData * data);

接受一个指向 PNGData 结构的指针,但是这个

void write_png_file(char* file_name, PNGDataPtr * data);

接受一个指向 PNGData 结构的指针。

不要混淆 PNGDataPtrPNGData * - 它们是同一回事,您自己会感到困惑。

理想情况下,完全摆脱 PNGDataPtr。如果您坚持这个想法,总是 使用 PNGDataPtr 从不 使用 PNGData *。只是不要混用。