繁体   English   中英

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

[英]Is it good practice to have the same function names in multiple header files?

我正在用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还是thing2_help ,还是可以将它们保留为原样?

首先,请进一步了解C预处理程序的工作原理,并阅读cpp文档

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

因此,头文件通常是常规的东西(但是, C99标准确实要求一些标准头,例如<stdlib.h><stdio.h>POSIX规范也要求一些头)。 常见的做法包括:

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

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

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

查看代码的预处理形式(这是大多数编译器关心的,因为预处理器是编译器的第一阶段)。 您可以使用GCC使用以下方法获取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指令之后添加一个#include "thing.h"

这两个帮助函数都应该是各自的c文件,因此名称冲突并不重要,因为它们是该编译单元范围的私有文件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM