[英]is it considered good practice to have conditionals in public header files?
[英]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_help
和thing2_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_*/
然后将help
和thing1
的定义放在例如您的everything.c
并在其他#include
指令之后添加一个#include "thing.h"
。
这两个帮助函数都应该是各自的c文件,因此名称冲突并不重要,因为它们是该编译单元范围的私有文件。
通常,将代码保存在c文件中,仅将声明保存在h文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.