包含庫頭文件注意事項

字號:

考試大今天,就給大家說一說使用頭文件得注意的地方.
    給大家一個例子吧:
    #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()庫函數.
    所以這樣做問題是沒有,但也得注意一下,這樣做是不是妥當.