c头文件和函数调用

之前写了个小程序。包含了头文件Node.h

程序如下:


Node.h中是:

#include<stdio.h>

void Dis()
{
     int year;
     printf("Please input a year!\n");
     scanf("%d",&year);
     Year(year);
}
void Year(int year)
{  
      printf("The year is:  %d\n",year);
}
     
接着主文件中是:
#include <stdio.h>
#include "Node.h"
int main()
{
	Dis();
	return 1;
}

但是运行程序时报错!
原因是在Year函数在Dis函数后面,而在Dis函数前又没有Year函数的声明,所以在Dis函数中调用Year函数会报错,找不到嘛。
这可以联系单模块中的程序编程,main函数中调用的函数有两种方式:
1、在Main函数前先定义,告诉编译器,有这个函数,先留点空间。然后在main函数后进行函数的定义。
2、在main函数前直接进行函数的定义。
 
下面来来聊一下头文件。
c头文件的功能是:在编译预处理时,用文件包含指令中所指定的文件名的文本内容来替代该命令,是包含该文件的内容成为本程序的一部分。
举个例子。
该例子包含两个模块:(共三个文件)Utility.h,Utility.c,Main.c
三个文件内容如下:

Utility.h:

#ifndef UTILITY_H
#define UTILITY_H
void Display();
int DaysOfYear();
#endif

Utility.c:
#include <stdio.h>
int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
void Display()
{
	int m;
	for (m=0;m<12;m++)
	{
		printf("%3d",dys[m]);
	}
	printf("\n");
}


int DaysOfYear()
{
	int m,t=0;
	for (m=1;m<=12;m++)
	{
		t+=dys[m-1];
	}
	return t;
}

Main.c:
#include <stdio.h>
#include "utility.h"
int main()
{
	Display();
	printf("%d\n",DaysOfYear());
	return 0;
}

文件包含预处理指令执行结束后(这里不包含stdio.h的处理),代码如下:

#include <stdio.h>

void Display();
int DaysOfYear();

int dys[]={31,28,31,30,31,30,31,31,30,31,30,31};
void Display()
{
	int m;
	for (m=0;m<12;m++)
	{
		printf("%3d",dys[m]);
	}
	printf("\n");
}


int DaysOfYear()
{
	int m,t=0;
	for (m=1;m<=12;m++)
	{
		t+=dys[m-1];
	}
	return t;
}
int main()
{
	Display();
	printf("%d\n",DaysOfYear());
	return 0;
}

程序在编译时是单文件编译的,所以当编译Node.h时,发现不满足函数先定义后调用,故报错!
在看下面一个程序:
Node.c中程序:
 
#include<stdio.h>

void Dis()
{
     int year;
     printf("Please input a year!\n");
     scanf("%d",&year);
     Year(year);
}
void Year(int year)
{  
      printf("The year is:  %d\n",year);
}

Main.c中程序:
#include <stdio.h>
#include "Node.h"
extern void Dis();
extern void Year(int year);


int main()
{
	Dis();
	return 1;
}

结果发现编译不通过,道理是一样的!
编译Node.c文件时,函数不满足先定义后调用,所以报错,尽管在main.c中有函数声明,但不在同一个文件中!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值