考試大今天,就給大家說一說使用頭文件得注意的地方.
給大家一個例子吧:
#include
#define BUFSIZ 128
int main(void)
{
return 0;
}
編譯一下,給現了一個警告:
Compiling D:\TURBOC2\NONAME.C:
Warning D:\TURBOC2\NONAME.C 2: Redefinition of ’BUFSIZ’ is not identical
examda提示: 原來是在stdio.h頭文件中也宏定義了BUFSIZ.
因此,我們在使用宏時,不能和頭文件中定義的宏相同.這點值得大家注意.
還有頭文件中的函數也得注意,我們選用的函數名也不能和頭文件中的函數名相同.
看一看下面的例子:
#include
char unlink(void);
int main(void)
{
return 0;
}
char unlink(void)
{
}
編譯一下,出現了二個錯誤:
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作為函數名,出現了重名.編譯器會把代碼中的出現unlink函數
看作是unlink()的定義,因此,就出現的重定義函數時的參數類型不對.
但我把上出的代碼改一下:
#include
int unlink(const char* path)
{
printf("%s",path);
}
int main(void)
{
unlink("OK?");
return 0;
}
編譯一下,沒有出現錯誤,再鏈接一下,也沒有出現錯誤.
結果:
OK?
也就是說,鏈接器并沒有鏈接庫函數unlink().
說明鏈接器不是把所的頭文件中的庫函數都鏈接,而是把代碼中使用到的庫函數鏈接.
而代碼使用的unlink()在代碼中已經定義了,所以鏈接器并不鏈接unlink()庫函數.
所以這樣做問題是沒有,但也得注意一下,這樣做是不是妥當.
給大家一個例子吧:
#include
#define BUFSIZ 128
int main(void)
{
return 0;
}
編譯一下,給現了一個警告:
Compiling D:\TURBOC2\NONAME.C:
Warning D:\TURBOC2\NONAME.C 2: Redefinition of ’BUFSIZ’ is not identical
examda提示: 原來是在stdio.h頭文件中也宏定義了BUFSIZ.
因此,我們在使用宏時,不能和頭文件中定義的宏相同.這點值得大家注意.
還有頭文件中的函數也得注意,我們選用的函數名也不能和頭文件中的函數名相同.
看一看下面的例子:
#include
char unlink(void);
int main(void)
{
return 0;
}
char unlink(void)
{
}
編譯一下,出現了二個錯誤:
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作為函數名,出現了重名.編譯器會把代碼中的出現unlink函數
看作是unlink()的定義,因此,就出現的重定義函數時的參數類型不對.
但我把上出的代碼改一下:
#include
int unlink(const char* path)
{
printf("%s",path);
}
int main(void)
{
unlink("OK?");
return 0;
}
編譯一下,沒有出現錯誤,再鏈接一下,也沒有出現錯誤.
結果:
OK?
也就是說,鏈接器并沒有鏈接庫函數unlink().
說明鏈接器不是把所的頭文件中的庫函數都鏈接,而是把代碼中使用到的庫函數鏈接.
而代碼使用的unlink()在代碼中已經定義了,所以鏈接器并不鏈接unlink()庫函數.
所以這樣做問題是沒有,但也得注意一下,這樣做是不是妥當.