user-0 提问: 生成.a文件时，如果接口函数是结构体，.h头文件应该怎么写？

回复:
user: user-1
content: 引用 22 楼 sys0613 的回复:[quote=引用 16 楼 ysu_yujie 的回复:]  这是不会出错的 再就是我不知道您昵称为何变了，我给分的昵称和你左侧头像昵称不一致呢。。[/quote] 这个还真不清楚怎么回事，不过收到分就可以，哈哈！

user: user-0
content: 引用 16 楼 ysu_yujie 的回复:这是不会出错的  我是给您100分，给17楼100分，我这帖子一共就是200分的帖子，不知道为什么17楼变成200分了。哈哈，我怕没给上你们分数，我核查下分数，发现多出来100分。。。再次感谢您的回答，豁然开朗。

user: user-0
content: 引用 16 楼 ysu_yujie 的回复:这是不会出错的 再就是我不知道您昵称为何变了，我给分的昵称和你左侧头像昵称不一致呢。。

user: user-0
content: 引用 16 楼 ysu_yujie 的回复:[quote=引用 13 楼 sys0613 的回复:] [quote=引用 10 楼 ysu_yujie 的回复:] 问题1：只要你生成.a文件时没有报错，就没有问题，在.a文件中已经不存在什么结构体了 问题2：你要明白，一个c文件内包含h文件时，编译时会将h文件中的内容拷贝到c文件中，然后h文件就没有用了 问题3：即使你告诉客户的结构体定义和你自己使用的不一样，只是名字一样，那么在编译的时候不会报错，但运行时可能会出错。 收到，豁然开朗，最有一个小问题，和您确认下， 我给用户的头文件.h中有如下结构体，作为接口函数的参数。 typedef struct MMstruct{   char *name;   int age;   char *job; } MM; ，我在打包.a时，在其他的.h文件中也有相同的结构体定义，就是说我提供给用户的是abc.h,但是我打包.a文件时候用的是def.h，def.h中包含MM结构体的定义，但是其中还包含好多别的结构体定义，我在提供给用户时候，将别的结构体定义都删除了。这时用户使用abc.h时候，传入MM入参，肯定不会出错吧？还有出错的可能么？谢谢谢，这时最后一个问题，我就是想确定下，太麻烦您了[/quote] 这是不会出错的[/quote] 收到，多谢，结贴给分

user: user-2
content: 要就提供所有的.h文件，要就把.h的文件放到hello.h中给其使用（同时去掉#include "common.h"）

user: user-2
content: 引用 15 楼 sys0613 的回复:引用 14 楼 paschen 的回复:引用 8 楼 sys0613 的回复:引用 6 楼 paschen 的回复:它要用到什么你就提供什么，如果你自己开发的你应该是比较清楚的，楼主好好体会一下我是新手，有点理解不上来了。。感觉东西不难。。就是没理解过去这个湾。。我想问下，不是接口处用的结构体，是我自己内部用的结构体定义的.h文件我不需要提供给用户，是这个意思不？那用户使用我的.a文件时候，能找到定义内部结构体的.h文件么？他需要什么你就得提供什么，你可以自己新建个程序调用你写的DLL，看需要哪些文件才能编译成功我是C语言linux下的.a文件，主要场景有点多，我测试了一些，还有的场景比较复杂，抽出来不好测试。所以想先把原理问问清楚，谢谢了原理不是和你说了，你自己再体会一下

user: user-1
content: 引用 13 楼 sys0613 的回复:[quote=引用 10 楼 ysu_yujie 的回复:] 问题1：只要你生成.a文件时没有报错，就没有问题，在.a文件中已经不存在什么结构体了 问题2：你要明白，一个c文件内包含h文件时，编译时会将h文件中的内容拷贝到c文件中，然后h文件就没有用了 问题3：即使你告诉客户的结构体定义和你自己使用的不一样，只是名字一样，那么在编译的时候不会报错，但运行时可能会出错。 收到，豁然开朗，最有一个小问题，和您确认下， 我给用户的头文件.h中有如下结构体，作为接口函数的参数。 typedef struct MMstruct{   char *name;   int age;   char *job; } MM; ，我在打包.a时，在其他的.h文件中也有相同的结构体定义，就是说我提供给用户的是abc.h,但是我打包.a文件时候用的是def.h，def.h中包含MM结构体的定义，但是其中还包含好多别的结构体定义，我在提供给用户时候，将别的结构体定义都删除了。这时用户使用abc.h时候，传入MM入参，肯定不会出错吧？还有出错的可能么？谢谢谢，这时最后一个问题，我就是想确定下，太麻烦您了[/quote] 这是不会出错的

user: user-0
content: 引用 14 楼 paschen 的回复:引用 8 楼 sys0613 的回复:引用 6 楼 paschen 的回复:它要用到什么你就提供什么，如果你自己开发的你应该是比较清楚的，楼主好好体会一下我是新手，有点理解不上来了。。感觉东西不难。。就是没理解过去这个湾。。我想问下，不是接口处用的结构体，是我自己内部用的结构体定义的.h文件我不需要提供给用户，是这个意思不？那用户使用我的.a文件时候，能找到定义内部结构体的.h文件么？他需要什么你就得提供什么，你可以自己新建个程序调用你写的DLL，看需要哪些文件才能编译成功 我是C语言linux下的.a文件，主要场景有点多，我测试了一些，还有的场景比较复杂，抽出来不好测试。所以想先把原理问问清楚，谢谢了

user: user-2
content: 引用 8 楼 sys0613 的回复:引用 6 楼 paschen 的回复:它要用到什么你就提供什么，如果你自己开发的你应该是比较清楚的，楼主好好体会一下我是新手，有点理解不上来了。。感觉东西不难。。就是没理解过去这个湾。。我想问下，不是接口处用的结构体，是我自己内部用的结构体定义的.h文件我不需要提供给用户，是这个意思不？那用户使用我的.a文件时候，能找到定义内部结构体的.h文件么？他需要什么你就得提供什么，你可以自己新建个程序调用你写的DLL，看需要哪些文件才能编译成功

user: user-0
content: 引用 10 楼 ysu_yujie 的回复:问题1：只要你生成.a文件时没有报错，就没有问题，在.a文件中已经不存在什么结构体了 问题2：你要明白，一个c文件内包含h文件时，编译时会将h文件中的内容拷贝到c文件中，然后h文件就没有用了 问题3：即使你告诉客户的结构体定义和你自己使用的不一样，只是名字一样，那么在编译的时候不会报错，但运行时可能会出错。 收到，豁然开朗，最有一个小问题，和您确认下， 我给用户的头文件.h中有如下结构体，作为接口函数的参数。 typedef struct MMstruct{   char *name;   int age;   char *job; } MM; ，我在打包.a时，在其他的.h文件中也有相同的结构体定义，就是说我提供给用户的是abc.h,但是我打包.a文件时候用的是def.h，def.h中包含MM结构体的定义，但是其中还包含好多别的结构体定义，我在提供给用户时候，将别的结构体定义都删除了。这时用户使用abc.h时候，传入MM入参，肯定不会出错吧？还有出错的可能么？谢谢谢，这时最后一个问题，我就是想确定下，太麻烦您了

user: user-0
content: 引用 11 楼 cfjtaishan 的回复:[quote=引用 9 楼 sys0613 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 sys0613 的回复:] [quote=引用 1 楼 paschen 的回复:] 要就提供所有的.h文件，要就把.h的文件放到hello.h中给其使用（同时去掉#include "common.h"） 您意思是我模块中的所有的.h文件都要提供给用户？就算不是接口函数用到的.h文件也要给用户？谢谢了[/quote] 如果接口参数是你需要的结构体类型，那么需要将结构体声明提供给别人。即需要提供hello.h和common.h； [/quote] 收到，多谢，如果有客户没用到，但是我自己内部用到的结构体呢，这个结构体的定义的.h文件需要提供给用户么？[/quote] 自己内部需要的结构体要和外部的区分开。就是头文件也要分类。[/quote] 收到，明白了，感谢

user: user-3
content: 引用 9 楼 sys0613 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 sys0613 的回复:] [quote=引用 1 楼 paschen 的回复:] 要就提供所有的.h文件，要就把.h的文件放到hello.h中给其使用（同时去掉#include "common.h"） 您意思是我模块中的所有的.h文件都要提供给用户？就算不是接口函数用到的.h文件也要给用户？谢谢了[/quote] 如果接口参数是你需要的结构体类型，那么需要将结构体声明提供给别人。即需要提供hello.h和common.h； [/quote] 收到，多谢，如果有客户没用到，但是我自己内部用到的结构体呢，这个结构体的定义的.h文件需要提供给用户么？[/quote] 自己内部需要的结构体要和外部的区分开。就是头文件也要分类。

user: user-1
content: 问题1：只要你生成.a文件时没有报错，就没有问题，在.a文件中已经不存在什么结构体了 问题2：你要明白，一个c文件内包含h文件时，编译时会将h文件中的内容拷贝到c文件中，然后h文件就没有用了 问题3：即使你告诉客户的结构体定义和你自己使用的不一样，只是名字一样，那么在编译的时候不会报错，但运行时可能会出错。

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 sys0613 的回复:] [quote=引用 1 楼 paschen 的回复:] 要就提供所有的.h文件，要就把.h的文件放到hello.h中给其使用（同时去掉#include "common.h"） 您意思是我模块中的所有的.h文件都要提供给用户？就算不是接口函数用到的.h文件也要给用户？谢谢了[/quote] 如果接口参数是你需要的结构体类型，那么需要将结构体声明提供给别人。即需要提供hello.h和common.h； [/quote] 收到，多谢，如果有客户没用到，但是我自己内部用到的结构体呢，这个结构体的定义的.h文件需要提供给用户么？

user: user-0
content: 引用 6 楼 paschen 的回复:它要用到什么你就提供什么，如果你自己开发的你应该是比较清楚的，楼主好好体会一下 我是新手，有点理解不上来了。。感觉东西不难。。就是没理解过去这个湾。。 我想问下，不是接口处用的结构体，是我自己内部用的结构体定义的.h文件我不需要提供给用户，是这个意思不？那用户使用我的.a文件时候，能找到定义内部结构体的.h文件么？

user: user-0
content: 引用 4 楼 ysu_yujie 的回复:这个也不一定是全部的.h文件，看你提供给客户的接口函数包含哪些内容了。以你上面举的例子为例，你提供给用户一个函数int fun1(MM *mm);该函数中包含结构体MM，但如果你不提供MM的定义，客户该如何使用该结构体呢？除非你在写一个文档告诉客户这个结构体是如何定义的，然后客户自己在写一个名字一样的结构体定义。 如果你在内部还使用了一个结构体GG，但接口函数中没有表现出来，那么这个GG的定义头文件就不需要提供了，因为客户用不到。 您说的太对了，您说的就是我要问的。我现在有两个问题，麻烦您帮忙看下，我有点理解不了。 问题1，就是您说的，但我内部还有别的结构体GG，在接口函数中没有表现出来，定义在另一个例如叫pp.h的文件中，我就是正常打包生成了.a文件（命令 ar rc libhello.a hello.c）,里面没有提及到pp.h文件，那么用户直接用libhello.a和hello.h文件，不会报错么？他能找到pp.h中的GG的结构体定义么？因为ar时候并没有用pp.h文件啊，虽然和用户用不到，但是我自己的模块这个hello.c中要用到啊。 问题2，就是延续问题1，点h文件是否被封进了.a中 问题3，如果我不提供MM的定义，用文档告诉客户这个结构体如何定义，让客户自己写一个名字一样的结构体定义。但是我自己的、没提供给用户的.h文件中，也有相同的定义，用户使用我的接口时，不会报错么？ 写的有点多，不知道您能看懂不，麻烦您了

user: user-2
content: 它要用到什么你就提供什么，如果你自己开发的你应该是比较清楚的，楼主好好体会一下

user: user-2
content: 引用 2 楼 一升米的回复:[quote=引用 1 楼 paschen 的回复:] 要就提供所有的.h文件，要就把.h的文件放到hello.h中给其使用（同时去掉#include "common.h"） 您意思是我模块中的所有的.h文件都要提供给用户？就算不是接口函数用到的.h文件也要给用户？谢谢了[/quote] 用于实现接口功能的（通常包含在源文件中）的头文件不需要提供，但接口参数类型等这些头文件（通常定义在你头文件中）需要提供

user: user-1
content: 这个也不一定是全部的.h文件，看你提供给客户的接口函数包含哪些内容了。以你上面举的例子为例，你提供给用户一个函数int fun1(MM *mm);该函数中包含结构体MM，但如果你不提供MM的定义，客户该如何使用该结构体呢？除非你在写一个文档告诉客户这个结构体是如何定义的，然后客户自己在写一个名字一样的结构体定义。 如果你在内部还使用了一个结构体GG，但接口函数中没有表现出来，那么这个GG的定义头文件就不需要提供了，因为客户用不到。

user: user-3
content: 引用 2 楼 sys0613 的回复:[quote=引用 1 楼 paschen 的回复:] 要就提供所有的.h文件，要就把.h的文件放到hello.h中给其使用（同时去掉#include "common.h"） 您意思是我模块中的所有的.h文件都要提供给用户？就算不是接口函数用到的.h文件也要给用户？谢谢了[/quote] 如果接口参数是你需要的结构体类型，那么需要将结构体声明提供给别人。即需要提供hello.h和common.h；