我想知道如何使结构在库内和外部标头中都可见。让我尝试用下面的代码来解释一下
我有一个结构:
typedef struct{
int a;
int b;
}strt_1;
我想在应用程序中创建一个相同的实例并将其传递给库函数,然后更新其中的 a 和 b 变量,因此
申请
int main()
{
strt_1 a;
foo(&a);
}
图书馆内:
int foo(strt_1 *a)
{
a->b = 0;
a->a = 1;
}
问题: 如果我在库中创建结构的定义,当我在应用程序中重新键入相同的定义时,它会显示为重新定义(显然)。但是如果我在应用程序中输入它,我将无法编译它,因为它说缺少定义,Soo,如何向外部第 3 方库用户显示结构的内容,并使其对库编译器可见?
您应该将结构和
typedef
放入库附带的头文件中。库和使用该库的应用程序都使用此头文件。头文件中定义的结构和 typedef 不会导致多个定义错误,只有在两者中定义 全局变量或函数才会出现这种情况。
此外,库中的函数也应该在库的头文件中原型化。
标准中已使用一种简单的解决方案。
你可以尝试用#ifdef封装它。
类似
--- 头文件 ---
#ifndef LIBRARYHEADERFILE_INCLUDED
#define LIBRARYHEADERFILE_INCLUDED
typedef struct{
int a;
int b;
}strt_1;
int foo(strt_1 *a);
#endif
--- 结束头文件---
然后,在主程序和库上,#include 头文件。 就是这样。您的新类型和函数现在在每个地方都可见,不用担心重新定义错误。
将
typedef
放入 MyLibrary.h
头文件中。然后 #include "MyLibrary"
在您的库源文件和使用库的二进制版本的外部代码中。
在头文件中定义结构体,并在使用该结构体之前将该标头包含在 c 文件中。