项目结构
对于一个标准的 C/C++ 项目来说,一定要做到不同属性的代码放到不同的文件:
xx.h:头文件,专门存放各种函数的声明,不应该写具体的实现,作用相当于函数文档。
xxx.c xxx.cpp:源文件,专门存放各种函数的实现,头文件声明了什么都应该在这里写声明。
虽然可以在头文件写函数实现,但通常不建议这样做,因为会出现比较棘手的问题。
预处理的事情
#include
最重要的就是 "#include" 语句,他是多文件编写的核心组成。
假设有这样一个程序:
#include <stdio.h>
int main(){
printf("hello world\n");
return 0;
}
编译器的预处理模块识别到 "#include" 语句,代表需要将系统的函数声明充填到相关语句的位置。
经过 #include 预处理后,他是这样的:
/* 假象的 stdio.h */
#ifndef STDIO_H
#define STDIO_H
// printf 函数的定义
void printf(const char *fmt);
#endif
/* stdio.h 结束 */
int main(){
printf("hello world\n");
return 0;
}
然后这个源程序就得到了 printf 函数的定义,就可以随时调用这个函数实现相关功能。
#ifndef
在多文件编写上,最大的坑就是容易出现重复定义的问题,但就如上面的程序头文件一样,在每个头文件头两行加上一个特殊的宏定义,在行尾 endif,就可以避免了。
#ifndef A_H
#define A_H
// 各种函数声明
#endif
只要这样做了,在多个源文件里 #include 相同的头文件时,编译器会忽略除第一次以外的包含预处理。
不应该做的
不要包含源文件
正常来说,你不应该 #include 源文件,源文件应该是作为参数传递给编译器,然后编译器将其转换为机器指令,最后再将所有库的机械码组成你的可执行程序。反正就是,除非你知道自己正在做什么,否则绝对不要包含源文件。
用 Cookie 保存: 别名、Email