2

虽然我不是一个有经验的 C 程序员,但我必须在工作中使用这种语言来构建一个在 SunOS 和 Win32 上都可以编译的静态库。这个库只有几个源文件和它们对应的头文件(比如说:a.c、、b.c和)。该项目在两个平台上编译并生成库。a.hb.hmylib.a

我的问题是如何将实现的功能公开mylib.a给其他项目,因为当我同时添加两者时a.hb.h我会遇到一些宏重新定义错误。

编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的头文件无关)并且它已解决:) 但我仍然想就组织我的源文件和头文件提出建议。

我的疑问是我是否修改a.hb.h在外部使用,或者我是否应该专门创建一个头文件来声明这个库的接口(比方说mylib.h)。我不想使原始头文件过于复杂,但我不想让不同的头文件保持同步......我想听听更有经验的 C 程序员关于他们的模式、每种方法的优点以及是否有其他方法选项。

先感谢您。

编辑:似乎我没有提供足够的信息;下面的模式试图显示我的文件是如何组织的:每个代码文件只包含它的头,每个头都有一个保护条件,每个头都包括一个公共头,这个公共头包括所有头。

// a.c ----
#include "a.h"

// b.c ----
#include "b.h"

// a.h ----
#ifndef GUARD_A_H
#define GUARD_A_H
  # include "liball.h"
  void function_prototypes_implemented_in_a();
#endif // GUARD_A_H

// b.h ----
#ifndef GUARD_B_H
#define GUARD_B_H
  # include "liball.h"
  void function_prototypes_implemented_in_b();
#endif // GUARD_B_H

// liball.h ----
#ifndef GUARD_LIBALL_H
#define GUARD_LIBALL_H
  # include <time.h>   // standard headers
  # include <stdioa.h>

  # include "a.h"      // all headers in this project
  # include "b.h"
#endif // GUARD_LIBALL_H
4

2 回答 2

5

您应该有一个公共标头 ,mylib.h它只包含库用户需要知道的定义。

mylib-internal.h然后,您将拥有一个在项目中使用的私有标头。您不应尝试使两者“同步”,而应mylib-internal.h包含#include "mylib.h".

您还应该命名所有接口函数,例如mylib_initialize()etc,并确保所有私有的内部函数要么被声明static,要么被命名_mylib_internal_whatever(),这样用户就不会与其他库发生命名空间冲突。

于 2012-11-06T11:33:13.373 回答
0

你的问题太模糊了,所以我的回答是一个通用的建议,你应该避免双重包含并在标题中使用包含防护,如下所示:

a.h

#ifndef __HEADER_A_H__
#define __HEADER_A_H__ 
...
#endif

b.h

#ifndef __HEADER_B_H__
#define __HEADER_B_H__ 
...
#endif

编辑:就像我说的,避免双重(或循环)包含,没有必要liball.h包含a.hb.h而且,请注意liball.h标题保护与 相同b.h,因此b.h根本不会被定义!

于 2012-11-06T11:36:19.530 回答