我正在用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_help
和thing2_help
会不会更好,还是可以将它们保留原样?
答案 0 :(得分:5)
首先,请详细了解C preprocessor的工作原理,并阅读documentation of cpp
。
请注意,预处理是纯粹的文本操作。因此,您可以避免使用任何头文件和#include
指令,例如通过复制和粘贴的东西。那将是一个坏主意。
因此,头文件主要是传统的事物(但是,C99标准确实要求一些标准标头,例如<stdlib.h>
或<stdio.h>
;以及{{ 3}}规范也要求几个标题)。常见做法包括:
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_*/
然后将help
和thing1
的定义放在例如您的everything.c
并在其他#include "thing.h"
指令之后添加#include
。
答案 1 :(得分:1)
两个帮助函数都应该是相应的c文件,然后就会发生名称冲突并不重要,因为它们是该编译单元范围的私有。
通常将代码保存在c文件中,只保留h文件中的声明。