- 头文件的两种写法,哪个比较好呢?
作为一名本科计算机,硕士阶段软件工程的学生,自己深感惭愧这么多年来竟然未曾认认真真的修炼自己的“内功”。本科阶段虽然很喜欢操作系统这门课,学起来也很认真但是最好考试竟然是考得最差的一门。以前总是给自己找借口认为学习不扎实,现在想想其实这么多年学下来很少静下心来思考,想想书上说的这些东西到底为什么是这样,归根结底还是动手太少,正所谓实践出真知。
现在开始也为是不晚,结果刚刚做了一道机试题就出现了各种问题,题目是一道很简单的,没什么难度,冒泡排序就可以解决。但是当我想在本地环境中换个结构整理程序的时候,出现了各种问题,再次记下来共日后方便复习,纯属菜鸟日常,大神请忽略。
开始我的程序是这样的:
main函数部分
// jobdu.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <stdio.h>
#include "1202.h"
int main()
{
bubble();
return 0;
}
1202.h头文件:
#include<stdio.h>
void bubble(){
int n = 0;
int buf[100];
while(scanf("%d",&n)!=EOF){
int i = 0 , j=0;
for(i =0; i<n; i++){
scanf("%d ",&buf[i]);
}
for(i = n-1; i > 0; i--)
for(j = 0; j < i; j++)
{
if(buf[j]>buf[j+1]){
int tmp = buf[j];
buf[j] = buf[j+1];
buf[j+1] = tmp;
}
}
for(i = 0; i< n ; i++){
printf("%d ",buf[i]);
}
printf("\n");
}
}
后来想到上课是老师写的自定义的头文件经常是带条件编译的,于是自己也想试一下,下面是1202.h头文件:
#ifndef HH
#define HH
void bubble(void);
#endif
在1202.c文件中写函数的定义:
#include<stdio.h>
void bubble(){
int n = 0;
int buf[100];
while(scanf("%d",&n)!=EOF){
int i = 0 , j=0;
for(i =0; i<n; i++){
scanf("%d ",&buf[i]);
}
for(i = n-1; i > 0; i--)
for(j = 0; j < i; j++)
{
if(buf[j]>buf[j+1]){
int tmp = buf[j];
buf[j] = buf[j+1];
buf[j+1] = tmp;
}
}
for(i = 0; i< n ; i++){
printf("%d ",buf[i]);
}
printf("\n");
}
}
其他不变,这样就完成了带条件编译的头文件。这里条件编译#ifndef 后面跟的是标识符,数字是不可以的。这种头文件的定义方法才是最正确的。我们不应该在.h的头文件定义中写函数的定义,而是应该只写函数的声明。原因如下:
1. c/c++程序的运行需要两个阶段,编译和链接。编译阶段,编译器将每个.c或.cpp文件单独编译,形成目标代码。在这里面将变量和函数名(还有什么准确的忘记了,以后查阅资料补充上)转换成字符序列。由于是单独编译所以不同文件中相同函数名可能会重复。链接阶段是编译器将目标代码和库连接起来,并重新整理符号序列之类。。。。
2. 那么头文件是什么时候处理的呢?这是预处理器的事情而不是编译器要做的。在编译之前预处理器就将头文件中所声明的函数和变量放到要调用它的地方。如果多个文件都引入同一个头文件,那么编译时就会有多个相同的函数定义。
至于函数定义,最好放在另一个c或cpp文件中,例如xxx.h中声明的函数在xxx.c文件中定义,这样有利于程序的扩展。