2014-01-15 34 views
0

我只在爲什麼「strcat已經在***.obj中定義了」?

#include <stdio.h> 

void strcat(char* s, char* t); 

int main() 
{ 
    char str1[12] = "hello"; 
    char str2[] = ",world"; 
    strcat(str1, str2); 
    printf("%s\n", str1); 
    return 0; 
} 

void strcat(char* s, char* t) 
{ 
    int i = 0, j = 0; 
    while(*s != '\0') 
     i++; 

    while((*(s + i++) = *(t + j++)) != '\0'); 

} 

使用#include <stdio.h>但是,當我蓋了,控制檯輸出:

--------------------Configuration: test16 - Win32 Debug-------------------- 
Linking... 
LIBCD.lib(strcat.obj) : error LNK2005: _strcat already defined in test16src.obj 

爲什麼? strcat是否存在於stdio.h

PS: 您能否通過描述與其他文件鏈接時的進度來解釋鏈接錯誤?

+2

標題和庫在C中不一一對應,並且在完全不同的編譯階段處理。 –

+0

作爲一個網站的說明,擁有一個具有C庫函數名稱的函數,具有幾乎相同的語義,但仍然具有不同的原型是一個不錯的主意。 –

回答

6

strcat是一個C庫函數。見man strcatPOSIXor here fo windows)或string.hPOSIX)。

所以符號strcat用於標準C庫(此處爲LIBCD),它在鏈接階段自動鏈接到程序,其中出現錯誤。

錯誤通知您,如由編譯你的源代碼創建的目標文件test16src.o定義的符號strcat已經存在於連接到test16src.o創建最終的可執行標準庫(LIBCD)。

解決此符號名稱衝突使用不同的名稱爲您的實現,例如my_strcat()

+0

但我沒有使用「#include 」。@ alk – Al2O3

+4

@Rubby你鏈接到庫,它的鏈接時間錯誤。 – Cynede

+3

downvoter可能想解釋。 – alk

相關問題