2014-10-08 35 views
1

我正在写一个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,还是可以离开它们原样?

+1

你为什么不编译你的样本?如果你的编译器说它不好,你不得不接受这个,不管网上的那些随机的人想到它。 – nvoigt 2014-10-08 05:52:14

+0

为什么在头文件中有代码?这是不好的做法。 – weston 2014-10-08 05:52:52

+1

否;重复两个头文件中的help()函数并不是一个好主意。思考SPOT - 单点真相;也认为干 - 不要重复自己。将实际的代码嵌入到头文件中也不是一个好主意。你只应该为'inline'函数做到这一点,并且只有当你知道你在做什么。否则,标题只能包含变量和函数的声明,而不能包含定义。 – 2014-10-08 05:54:55

回答

5

首先,请了解C preprocessor的工作原理和读取documentation of cpp的方法。

请注意,预处理是纯文本操作。所以你可以避免有任何头文件和#include指令,例如通过复制和粘贴东西。这将是一个坏主意。

所以头文件大多是一个传统东西(然而,C99标准并强制一些标准的头,像<stdlib.h><stdio.h>;以及POSIX规范还规定了以下几个头)。常见的做法包括:

  • 包裹头文件的内容与include guard(禁用多个包含)
  • 只把声明,不定义(往往是“全球”)函数,类型变量的头文件。
  • static inline函数的定义放在头文件中。

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

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

看看你的代码的预处理形式(这是大多数编译器所关心的,因为预处理器是编译器的第一阶段)。你可以得到的使用GCCeverything.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指令后添加#include "thing.h"

1

这两个帮助函数都应该是相应的c文件,那么不会有名称冲突,因为它们对该编译单元的范围是私有的。

一般将代码保存在c文件中,只保存h文件中的声明。

相关问题