在多个头文件中使用相同的函数名称是一种好习惯吗?

时间:2014-10-08 05:49:42

标签: c header

我正在用C语言写一个用户区(目前是最小的)我正在使用BusyBox,你可以通过调用带有名字的符号链接来运行命令。我有一个“主”C文件,其中包含其中的所有其他文件(其他文件是头文件),然后如果符号链接名称匹配则运行其代码。我想知道在不同的头文件中使用相同名称的函数是否可以?

例如,如果我有thing1.h

void help(void)
{
    // Print help text for thing1
}

int thing1(int argc, char *argv[])
{
    if (something)
        help();
}

thing2.h

void help(void)
{
    // Print help text for thing2
}

int thing2(int argc, char *argv[])
{
    if (something)
        help();
}

everything.c

#include "thing1.h"
#include "thing2.h"

int main(int argc, char *argv[])
{
    if (something)
        thing1(argc, argv);
    else
        thing2(argc, argv);
}

将这些帮助功能分别重命名为thing1_helpthing2_help会不会更好,还是可以将它们保留原样?

2 个答案:

答案 0 :(得分:5)

首先,请详细了解C preprocessor的工作原理,并阅读documentation of cpp

请注意,预处理是纯粹的文本操作。因此,您可以避免使用任何头文件和#include指令,例如通过复制和粘贴的东西。那将是一个坏主意。

因此,头文件主要是传统的事物(但是,C99标准确实要求一些标准标头,例如<stdlib.h><stdio.h>;以及{{ 3}}规范也要求几个标题)。常见做法包括:

  • 使用POSIX包装头文件内容(以禁用多个包含)
  • 只在头文件中放置声明,而不是定义(通常是“全局”)函数,类型和变量。
  • static inline函数的定义放在头文件中。

实际上,标准标头包含(例如#include <stdlib.h>)原则上可以在没有任何stdlib.h文本文件的情况下实现:编译器实现可以例如,查询数据库来处理#include <stdlib.h>指令,但我知道没有编译器这样做。

有些人(包括我在内)正在将#include指令(特别是标准C99或Posix标题)放入其头文件中。其他人正在记录要包含在他们自己的头文件之前的标题列表。

查看代码的预处理形式(这是大多数编译器关心的,因为预处理器是编译器的第一个阶段)。您可以使用include guard

获取everything.c的预处理形式
 gcc -C -E everything.c > everything.i

然后使用编辑器或寻呼机查看everything.i内部。

在实践中,我建议如果它真的很短 - 你的thing2 static inline函数,那么要有一个单个(不是几个)标题:

// file thing.h
#ifndef THING_INCLUDED_
// declarations
void help(void);
int thing1(int argc, char *argv[]);
// definition:
static inline void thing2(int argc, char**argv) {
   if (something_with(argc, argv)) 
      help();
} 
#endif /*THING_INCLUDED_*/

然后将helpthing1定义放在例如您的everything.c并在其他#include "thing.h"指令之后添加#include

答案 1 :(得分:1)

两个帮助函数都应该是相应的c文件,然后就会发生名称冲突并不重要,因为它们是该编译单元范围的私有。

通常将代码保存在c文件中,只保留h文件中的声明。