考試大今天,就給大家說一說使用頭文件得注意的地方.
給大家一個(gè)例子吧:
#include
#define BUFSIZ 128
int main(void)
{
return 0;
}
編譯一下,給現(xiàn)了一個(gè)警告:
Compiling D:\TURBOC2\NONAME.C:
Warning D:\TURBOC2\NONAME.C 2: Redefinition of ’BUFSIZ’ is not identical
examda提示: 原來是在stdio.h頭文件中也宏定義了BUFSIZ.
因此,我們?cè)谑褂煤陼r(shí),不能和頭文件中定義的宏相同.這點(diǎn)值得大家注意.
還有頭文件中的函數(shù)也得注意,我們選用的函數(shù)名也不能和頭文件中的函數(shù)名相同.
看一看下面的例子:
#include
char unlink(void);
int main(void)
{
return 0;
}
char unlink(void)
{
}
編譯一下,出現(xiàn)了二個(gè)錯(cuò)誤:
Error D:\TURBOC2\NONAME.C 2: Type mismatch in redeclaration of ’unlink’
Error D:\TURBOC2\NONAME.C 8: Type mismatch in redeclaration of ’unlink’
由于stdio.h中有int _Cdecl unlink (const char *path);的聲明,
而你又使用unlink作為函數(shù)名,出現(xiàn)了重名.編譯器會(huì)把代碼中的出現(xiàn)unlink函數(shù)
看作是unlink()的定義,因此,就出現(xiàn)的重定義函數(shù)時(shí)的參數(shù)類型不對(duì).
但我把上出的代碼改一下:
#include
int unlink(const char* path)
{
printf("%s",path);
}
int main(void)
{
unlink("OK?");
return 0;
}
編譯一下,沒有出現(xiàn)錯(cuò)誤,再鏈接一下,也沒有出現(xiàn)錯(cuò)誤.
結(jié)果:
OK?
也就是說,鏈接器并沒有鏈接庫(kù)函數(shù)unlink().
說明鏈接器不是把所的頭文件中的庫(kù)函數(shù)都鏈接,而是把代碼中使用到的庫(kù)函數(shù)鏈接.
而代碼使用的unlink()在代碼中已經(jīng)定義了,所以鏈接器并不鏈接unlink()庫(kù)函數(shù).
所以這樣做問題是沒有,但也得注意一下,這樣做是不是妥當(dāng).
給大家一個(gè)例子吧:
#include
#define BUFSIZ 128
int main(void)
{
return 0;
}
編譯一下,給現(xiàn)了一個(gè)警告:
Compiling D:\TURBOC2\NONAME.C:
Warning D:\TURBOC2\NONAME.C 2: Redefinition of ’BUFSIZ’ is not identical
examda提示: 原來是在stdio.h頭文件中也宏定義了BUFSIZ.
因此,我們?cè)谑褂煤陼r(shí),不能和頭文件中定義的宏相同.這點(diǎn)值得大家注意.
還有頭文件中的函數(shù)也得注意,我們選用的函數(shù)名也不能和頭文件中的函數(shù)名相同.
看一看下面的例子:
#include
char unlink(void);
int main(void)
{
return 0;
}
char unlink(void)
{
}
編譯一下,出現(xiàn)了二個(gè)錯(cuò)誤:
Error D:\TURBOC2\NONAME.C 2: Type mismatch in redeclaration of ’unlink’
Error D:\TURBOC2\NONAME.C 8: Type mismatch in redeclaration of ’unlink’
由于stdio.h中有int _Cdecl unlink (const char *path);的聲明,
而你又使用unlink作為函數(shù)名,出現(xiàn)了重名.編譯器會(huì)把代碼中的出現(xiàn)unlink函數(shù)
看作是unlink()的定義,因此,就出現(xiàn)的重定義函數(shù)時(shí)的參數(shù)類型不對(duì).
但我把上出的代碼改一下:
#include
int unlink(const char* path)
{
printf("%s",path);
}
int main(void)
{
unlink("OK?");
return 0;
}
編譯一下,沒有出現(xiàn)錯(cuò)誤,再鏈接一下,也沒有出現(xiàn)錯(cuò)誤.
結(jié)果:
OK?
也就是說,鏈接器并沒有鏈接庫(kù)函數(shù)unlink().
說明鏈接器不是把所的頭文件中的庫(kù)函數(shù)都鏈接,而是把代碼中使用到的庫(kù)函數(shù)鏈接.
而代碼使用的unlink()在代碼中已經(jīng)定義了,所以鏈接器并不鏈接unlink()庫(kù)函數(shù).
所以這樣做問題是沒有,但也得注意一下,這樣做是不是妥當(dāng).