![]()
一些使用C语言的初学者不知道头文件(* .h文件)可以自己编写. 只知道在调用系统库函数时,必须使用#include语句包括一些头文件. 实际上,头文件(如.C文件)可以由您自己编写. 头文件是一个文本文件. 使用文本编辑器编写代码后,将其保存为扩展名.h. 头文件通常放置一些可重用的代码,例如函数声明,变量声明,常量定义,宏定义等. 当使用#include语句引用头文件时,等效于将头文件中的所有内容复制到#include中. 为了避免由于重复引用而导致的编译错误,头文件通常具有
#ifndef LABEL
#define LABEL
//代码部分
#endif
格式. 其中,LABEL是唯一标签,其命名规则与变量相同. 通常根据其所在的头文件的名称来命名. 例如,如果头文件的文件名称为hardware.h,则可以这样使用它:
#ifndef __HARDWARE_H__
#define __HARDWARE_H__
//代码部分
#endif
![]()
这意味着如果未定义__HARDWARE_H__,则将定义__HARDWARE_H__,并编译以下代码部分,直到遇到#endif. 这样,在重复引用时,由于已定义__HARDWARE_H__,因此不会编译代码的以下部分,从而避免了重复定义.
另一个地方是,当使用包含时,使用引号和尖括号的含义是不同的. 使用引号(“”)时,首先搜索项目文件所在的目录,然后搜索编译器头文件所在的目录. 使用尖括号(<>)时,搜索顺序相反. 假设我们有两个具有相同文件名的头文件hardware.h,但是内容不同. 一个保存在编译器指定的头文件目录中,我们称其为文件I;另一个保存在当前项目目录中,我们称之为文件II. 如果使用#include
作者用来编写C程序的IDE是CodeBlokcs,我的头文件放在D: \ CodeBlocks \ MinGW \ include文件夹中.
当我们编写C语言或C ++语言时,预处理文件全部表示为#include

所谓的“头文件”是指在源文件的头引入的文件. 顾名思义,它是头文件. 至于头文件本身,没有固定的格式和固定的扩展名. 您可以包括自己的C文件作为头文件. 至于扩展名h,它表示系统提供的头文件的类型. 如果是TC,则常规头文件路径为: TC / INCLUDE. 头文件都是纯文本格式,内容主要是函数定义或函数体.
在调用系统函数时,某些函数必须包含相应的头文件,然后才能使用它们. 例如,确定是否为字母的isalpha函数必须包含ctype.h头文件. 有些不是必需的,因为默认情况下已包含系统. 例如random 头文件,默认情况下包含包含Printf函数的头文件stdio.h. 尽管显示没有问题.
此外,对于系统提供的头文件,例如ctype.h,如果未编写扩展名,则系统将找不到该头文件,并且无法实现所包含的功能. 因此,正确的系统.h文件必须带有扩展名.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#ifndef RANDOMNUMBER_H_INCLUDED
#define RANDOMNUMBER_H_INCLUDED
#endif // RANDOMNUMBER_H_INCLUDED
//随机数库实现
void Randomize()
{
srand((unsigned)time(NULL)); //使用当前时间作为伪随机数
}
int GenerateRandomNumber(int low, int high)
{
double _d;
if(low > high)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
// 打印出红色字体
printf("Make sure input number: Low < High .\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
// 打印默认字体
exit(0);
}
_d = (double)rand()/((double)RAND_MAX + 1.0);
return low + (int)(_d * (high - low +1));
}
double GenerateRandomReal(double low, double high)
{
double _d;
if(low > high)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
printf("Make sure input number: Low < High .\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
exit(0);
}
_d = (double)rand()/((double)RAND_MAX + 1.0);
return low + _d * (high - low);
}

现在我们只需要写入需要使用随机数的文件
#ifndef RANDOMNUMBER_H_INCLUDED
#include "random_number.h"
#endif // RANDOMNUMBER_H_INCLUDED
您可以使用上面的函数调用.
以上文件仅写入头文件,并将定义和实现写入头文件. 实际上,我们可以将定义和实现分开(为了更好的封装,让用户专注于使用接口,而忽略实现细节).

头文件(random_number.h)中的代码如下:
#ifndef RANDOM_H_INCLUDED
#define RANDOM_H_INCLUDED
void Randomize(); //初始化伪随机数发生器
int GenerateRandomNumber(int low, int high); //生成一个随机整数介于low 和 high 之间
double GenerateRandomReal(double low, double high); //生成一个随机实数介于low 和 high 之间
#endif // RANDOM_H_INCLUDED
同时,需要一个.c文件来实现头文件中定义的功能. (Random_number.c)具体代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#ifndef RANDOM_H_INCLUDED
#include "random.h"
#endif
//随机数库实现
void Randomize()
{
srand((unsigned)time(NULL)); //使用当前时间作为伪随机数
}
int GenerateRandomNumber(int low, int high)
{
double _d;
if(low > high)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
// 打印出红色字体
printf("Make sure input number: Low < High .\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
// 打印默认字体
exit(0);
}
_d = (double)rand()/((double)RAND_MAX + 1.0);
return low + (int)(_d * (high - low +1));
}
double GenerateRandomReal(double low, double high)
{
double _d;
if(low > high)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
printf("Make sure input number: Low < High .\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
exit(0);
}
_d = (double)rand()/((double)RAND_MAX + 1.0);
return low + _d * (high - low);
}
此库使用与上一个库相同的方法. 但是我们建议您撰写更多文章
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-275087-1.html
美国佬在叙利亚被普京把了脸跑到南海来撒野
如果是包装漏气了