365bet体育在线世界杯-365bet大陆-365手机安全卫士下载

— 怀旧经典 · 永恒记忆 —

C/C++中函数声明的作用

C/C++中函数声明的作用

C/C++中函数声明和include头文件的作用

参考:https://blog.csdn.net/qq_28648279/article/details/78463345

一直想不明白,函数声明的作用。在include中我们只是把函数的声明放入代码了,调用函数的具体实现还是要看函数的定义,那么include函数声明到底有什么作用呢?按理说我只要能正确链接对应的函数定义就可以了呀?

在参考的博客中看到这么一段话:”其实函数声明的作用是让编译器帮你检查你调用函数时有没有错误。比如参数的数量是否正确,如果调用函数时候少传入一个参数,并且没有声明该函数,编译器无法知道你调用是否正确,只会提示一个警告。很多人会忽略警告,导致最后程序运行时出现异常。“

我尝试了下不声明函数(也不定义),直接在main中调用,然后编译代码,确实仅仅报出未定义的warning:

下面做一个实验,编写一个add函数的动态链接库和add函数声明的头文件,在test01.c文件中的并不include add.h头文件并直接在main中调用:

test01.c

#include

int main(){

printf("%d\n",add());

return 0;

}

编译得到目标文件test01.o,会提示warning:implicit declaration of function ‘add’ :

gcc -c test01.c -o test01.o

add.h

int add();

add.c

#include "add.h"

int add(){

return 12;

}

编译得到动态链接库libadd.so

gcc -shared -fPIC add.c -o libadd.so

然后编译出可执行文件test01,并不会有任何报错或warning,并且执行也正常

gcc test01.o -o test01 -L . -ladd -Wl,-rpath=/home/txz/

这说明,只要我们的对于函数的调用方式正确(返回值,参数等都正确)并且能正确链接到函数,那说明即便是在函数中不include 头文件(不声明函数)也是没有问题的!

然后我们进行另一个实验,延续上面的代码但是把add.c和add.h中的add函数修改为:

int add(int u);

int add(int u){

return u;

}

意味着我们在test01.c中的add调用方式其实是写错了的,没有传入参数。那么编译能不能通过呢?完全可以!没有任何报错和warning!!!

那么我们再在test01.c文件中include add.h头文件:

#include

#include"add.h"

int main(){

printf("%d\n",add());

return 0;

}

编译报错:

test01.c: In function ‘main’:

test01.c:4:16: error: too few arguments to function ‘add’

printf("%d\n",add());

^~~

In file included from test01.c:2:0:

add.h:1:5: note: declared here

int add(int u);

^~~

所以说假如在代码中出现函数的传入参数出错等问题的话,没有对函数进行声明会导致在编译阶段无法发现错误!因为没有通过函数声明的方式告诉在本文件中想要调用的这个函数的格式(返回值,类型,参数)!函数声明的作用就是为了在编译阶段对函数调用格式和用法就进行检查,检查你的调用方式和声明方式是否一致!

相关推荐

365手机安全卫士下载 e.l.f. cosmetics护肤系列四部曲开箱体验评测

e.l.f. cosmetics护肤系列四部曲开箱体验评测

📅 08-08 👁️ 7531
365bet体育在线世界杯 无法安装微信

无法安装微信

📅 08-17 👁️ 6512
365bet体育在线世界杯 猫咪耳朵发热正常吗?

猫咪耳朵发热正常吗?

📅 07-17 👁️ 6060
365bet体育在线世界杯 苹果手机应用商店在哪

苹果手机应用商店在哪

📅 09-02 👁️ 6014
365bet体育在线世界杯 综述:铱星公司破产不停业 铱星电话东山再起

综述:铱星公司破产不停业 铱星电话东山再起

📅 09-06 👁️ 5735
365bet体育在线世界杯 饥荒联机版兔子怎么抓-兔子怎么抓攻略

饥荒联机版兔子怎么抓-兔子怎么抓攻略

📅 08-05 👁️ 3794
365bet大陆 什麼是 YAML 以及它如何運作? :完整指南

什麼是 YAML 以及它如何運作? :完整指南

📅 08-16 👁️ 3966
365bet体育在线世界杯 盘点十部农村电影,展现的不仅仅是底层生活,更多的是人性

盘点十部农村电影,展现的不仅仅是底层生活,更多的是人性

📅 07-21 👁️ 7453
365手机安全卫士下载 跻 古文中的意思

跻 古文中的意思

📅 09-12 👁️ 2260
365手机安全卫士下载 世预赛C组形势严峻!世界第58排队下滑,国足晋级压力山大

世预赛C组形势严峻!世界第58排队下滑,国足晋级压力山大

📅 08-08 👁️ 5914