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

Dev*_*hDB 1 c header

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

例如,如果我有thing1.h:

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

int thing1(int argc, char *argv[])
{
    if (something)
        help();
}
Run Code Online (Sandbox Code Playgroud)

而且thing2.h:

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

int thing2(int argc, char *argv[])
{
    if (something)
        help();
}
Run Code Online (Sandbox Code Playgroud)

而且everything.c:

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

int main(int argc, char *argv[])
{
    if (something)
        thing1(argc, argv);
    else
        thing2(argc, argv);
}
Run Code Online (Sandbox Code Playgroud)

它会更好那些帮助功能重命名为thing1_helpthing2_help分别,还是确定要离开他们,因为他们是谁?

Bas*_*tch 5

首先,请了解C预处理器的工作原理,并阅读文档cpp.

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

所以头文件大多是传统的东西(但是,C99标准确实要求一些标准的头文件,比如<stdlib.h><stdio.h>;而POSIX规范也要求几个头文件).常见做法包括:

  • include guard包装头文件内容(禁用多个包含)
  • 只放置声明,而不是在头文件中定义(通常是"全局")函数,类型,变量.
  • static inline函数的定义放在头文件中.

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

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

查看代码的预处理形式(这是大多数编译器关心的,因为预处理器是编译器的第一个阶段).你可以得到经过预处理的形式everything.c使用GCC

 gcc -C -E everything.c > everything.i
Run Code Online (Sandbox Code Playgroud)

然后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_*/
Run Code Online (Sandbox Code Playgroud)

然后把定义helpthing1你在如everything.c添加有一个#include "thing.h"别人后#include的指令.