如何在 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 语言中我们惯用地避免 typedef
ing 纯粹是为了将某物标记为指向它的非 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
结构的指针。
不要混淆 PNGDataPtr
和 PNGData *
- 它们是同一回事,您自己会感到困惑。
理想情况下,完全摆脱 PNGDataPtr
。如果您坚持这个想法,总是 使用 PNGDataPtr
而 从不 使用 PNGData *
。只是不要混用。
我不明白为什么会这样。我可以调用 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 语言中我们惯用地避免 typedef
ing 纯粹是为了将某物标记为指向它的非 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
结构的指针。
不要混淆 PNGDataPtr
和 PNGData *
- 它们是同一回事,您自己会感到困惑。
理想情况下,完全摆脱 PNGDataPtr
。如果您坚持这个想法,总是 使用 PNGDataPtr
而 从不 使用 PNGData *
。只是不要混用。