淺析C語(yǔ)言頭文件和庫(kù)的一些問(wèn)題
更新時(shí)間:2013年07月16日 10:22:45 作者:
以下是對(duì)C語(yǔ)言中頭文件和庫(kù)的一些問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
使用gcc的編譯器 頭文件沒(méi)有包含stdlib.h,使用atoi函數(shù)(atoi函數(shù)在stdlib.h中才有聲明),編譯卻沒(méi)有出錯(cuò)
如果編譯的時(shí)候加上-Wall選項(xiàng),會(huì)有個(gè)警告,請(qǐng)問(wèn)這是為什么?
這是因?yàn)镃語(yǔ)言一個(gè)非常傻的規(guī)定:一個(gè)函數(shù)如果沒(méi)有聲明函數(shù)原型,其返回值類(lèi)型就是int(所謂的implicit declaration)。由于atoi恰好真返回int,所以你即使不包含它的頭文件也不報(bào)錯(cuò)。至于這個(gè)警告,是為了避免你由于忘記聲明函數(shù)原型而出錯(cuò)。
編譯器對(duì)于沒(méi)有定義過(guò)的函數(shù)原型直接當(dāng)作它返回int,它不需要知道它已經(jīng)定義過(guò)了
也就是說(shuō),當(dāng)你以一個(gè)參數(shù)列表調(diào)用atoi時(shí),編譯器已經(jīng)知道這個(gè)函數(shù)的參數(shù)列表是什么,它只不知道返回值而已,在這種情況下,編譯器還需要什么額外的東西呢?它當(dāng)然可以通過(guò)。
注意:編譯器不關(guān)心某個(gè)函數(shù)在哪個(gè)頭文件被定義,它只需要知道這個(gè)函數(shù)是什么原型即可
#include<stdio.h>
//#include<stdlib.h>
int main()
{
int i;
double f;
char b[5] = "23";
char c[5] = "2.3";
i = atoi(b);
f = atof(c);
printf("i=%d f=%lf\n", i, f);
return 0;
}
gcc test.c -o test沒(méi)有任何警告
gcc -Wall test.c -o test
出現(xiàn)警告:w9.c: In function `main':
w9.c:9: warning: implicit declaration of function `atoi'
w9.c:10: warning: implicit declaration of function `atof'
輸出結(jié)果:
i=23 f=1717986918.000000
加上#include<stdlib.h>則結(jié)果正常
看來(lái)atoi和atof都在C標(biāo)準(zhǔn)庫(kù)glibc中,但是很奇怪為什么C標(biāo)準(zhǔn)庫(kù)函數(shù)sqrt和pow卻不在glibc中
如果編譯的時(shí)候加上-Wall選項(xiàng),會(huì)有個(gè)警告,請(qǐng)問(wèn)這是為什么?
這是因?yàn)镃語(yǔ)言一個(gè)非常傻的規(guī)定:一個(gè)函數(shù)如果沒(méi)有聲明函數(shù)原型,其返回值類(lèi)型就是int(所謂的implicit declaration)。由于atoi恰好真返回int,所以你即使不包含它的頭文件也不報(bào)錯(cuò)。至于這個(gè)警告,是為了避免你由于忘記聲明函數(shù)原型而出錯(cuò)。
編譯器對(duì)于沒(méi)有定義過(guò)的函數(shù)原型直接當(dāng)作它返回int,它不需要知道它已經(jīng)定義過(guò)了
也就是說(shuō),當(dāng)你以一個(gè)參數(shù)列表調(diào)用atoi時(shí),編譯器已經(jīng)知道這個(gè)函數(shù)的參數(shù)列表是什么,它只不知道返回值而已,在這種情況下,編譯器還需要什么額外的東西呢?它當(dāng)然可以通過(guò)。
注意:編譯器不關(guān)心某個(gè)函數(shù)在哪個(gè)頭文件被定義,它只需要知道這個(gè)函數(shù)是什么原型即可
復(fù)制代碼 代碼如下:
#include<stdio.h>
//#include<stdlib.h>
int main()
{
int i;
double f;
char b[5] = "23";
char c[5] = "2.3";
i = atoi(b);
f = atof(c);
printf("i=%d f=%lf\n", i, f);
return 0;
}
gcc test.c -o test沒(méi)有任何警告
gcc -Wall test.c -o test
出現(xiàn)警告:w9.c: In function `main':
w9.c:9: warning: implicit declaration of function `atoi'
w9.c:10: warning: implicit declaration of function `atof'
輸出結(jié)果:
i=23 f=1717986918.000000
加上#include<stdlib.h>則結(jié)果正常
看來(lái)atoi和atof都在C標(biāo)準(zhǔn)庫(kù)glibc中,但是很奇怪為什么C標(biāo)準(zhǔn)庫(kù)函數(shù)sqrt和pow卻不在glibc中
相關(guān)文章
C++友元(Friend)用法實(shí)例簡(jiǎn)介
這篇文章主要介紹了C++友元(Friend)用法,對(duì)于C++的學(xué)習(xí)來(lái)說(shuō)有很好的參考價(jià)值,需要的朋友可以參考下2014-08-08
C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(201.數(shù)字范圍位相與),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C語(yǔ)言庫(kù)函數(shù)getchar()新見(jiàn)解
用getchar()函數(shù)讀取字符串時(shí),字符串會(huì)存儲(chǔ)在輸入緩沖區(qū)中,包括輸入的回車(chē)字符,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中g(shù)etchar()的用法以及案例的相關(guān)資料,需要的朋友可以參考下2022-07-07
C++11中的時(shí)間庫(kù)std::chrono(引發(fā)關(guān)于時(shí)間的思考)
這篇文章主要介紹了C++11中的時(shí)間庫(kù)std::chrono(引發(fā)關(guān)于時(shí)間的思考),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
C語(yǔ)言中static的作用及C語(yǔ)言中使用靜態(tài)函數(shù)有何好處
在C語(yǔ)言中,static的作用有三條:一是隱藏功能,二是保持持久性功能,三是默認(rèn)初始化為0。本文重點(diǎn)給大家介紹C語(yǔ)言中static的作用及c語(yǔ)言中使用靜態(tài)函數(shù)有何好處,對(duì)本文感興趣的朋友一起看看吧2015-11-11

