我正在用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_help和thing2_help分别,还是确定要离开他们,因为他们是谁?
请注意,预处理是纯文本操作.因此,您可以避免使用任何头文件和#include指令,例如通过复制和粘贴事物.那将是个坏主意.
所以头文件大多是传统的东西(但是,C99标准确实要求一些标准的头文件,比如<stdlib.h>或<stdio.h>;而POSIX规范也要求几个头文件).常见做法包括:
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)
然后把定义的help和thing1你在如everything.c添加有一个#include "thing.h"别人后#include的指令.
| 归档时间: |
|
| 查看次数: |
2122 次 |
| 最近记录: |