2014-01-23 21 views
2

爲什麼我不能在vc 6.0中使用#include "getline.c"strindex.c在c中使用''#include'和這個鏈接錯誤?

       -----test30src.c------ 

#include <stdio.h> 
#include "getline.c" 
#include "strindex.c" 

#define MAXLINE 1000 

char pattern[] = "ould"; 

int main() 
{ 
    char line[MAXLINE]; 
    int found = 0; 
    while(getline(line, MAXLINE) > 0) 
     if(strindex(line, pattern) >= 0){ 
      printf("%s", line); 
      found++; 
     } 

    return found; 
} 

           ------getline.c------ 
#include <stdio.h> 

int getline(char s[], int lim) 
{ 
    int c, i; 
    i = 0; 

    while(--lim > 0 && (c = getchar()) != EOF && c != '\n') 
     s[i++] = c; 
    if(c=='\n') 
     s[i++] = c; 
    s[i] = '\0'; 
    return i; 
} 
           -----strindex.c----- 
int strindex(char s[], char t[]) 
{ 
    int i, j, k; 

    for(i = 0; s[i] != '\0'; i++){ 
     for(j = i, k = 0; s[j] == t[k]; j++, k++) 
      ; 
     if(k > 0 && t[k] == '\0') 
      return j; 
    } 

    return -1; 

} 

錯誤:

--------------------Configuration: test30 - Win32 Debug-------------------- 
Linking... 
getline.obj : error LNK2005: _getline already defined in test30src.obj 
strindex.obj : error LNK2005: _strindex already defined in test30src.obj 
Debug/test30.exe : fatal error LNK1169: one or more multiply defined symbols found 
+2

你爲什麼'#include'-ING **。C **文件,而不是**。ħ**文件? –

+0

我覺得'#include'只會複製'.c'文件?這樣對嗎? – Al2O3

+0

getline.obj和strindex.obj不是必需的情況下這樣做。 – BLUEPIXY

回答

1

您應該包括string.h中,而不是getline.c

1

您不得含有定義文件,也將最終的多個實例相同的功能。創建僅包含聲明的頭文件。

getline.c(定義)

#include "getline.h" 
int getline(char s[], int lim) { ... } 

getline.h(僅聲明)

#ifndef GETLINE_H  
#define GETLINE_H 
int getline(char s[], int lim); 
#endif 

的main.c(僅包括報頭)

#include "getline.h" 
1

大多數IDE將默認編譯所有.c文件。在這裏,它自己編譯一次getline.cstrindex.c,第二次編譯testsrc30.c,其中包括兩個其他文件。請記住,#include指令只是複製包含文件的內容。

在連接時,一些符號被發現兩次,鏈接器不能處理ambiguity-

標準使用#include的的方法是用含頭的聲明(.H)文件你的功能。

//getline.h 

#ifndef GETLINE_H //Header guard - avoid multiple inclusion 
#define GETLINE_H 
#include <stdio.h> 

int getline(char s[], int lim); //function declaration 

#endif // GETLINE_H 

//getline.c 

#include "getline.h" 

int getline(char s[], int lim) //declaration 
{ 
    // Implement whatever your function does 
} 

// test30src.c 
#include "getline.h" 

int main(void) 
{ 
    // Put your code here 
} 

在某些情況下,包含.c文件可能是可以容忍的。但在這種情況下,您應該確保這些.c文件不是自行編譯並鏈接的。看到這個相關的問題:Including one C source file in another?

-1

你可以包括這樣的c文件,但一定要把這些文件放在同一個目錄中,否則給完整的路徑。

#include "complete_path/getline.c" 

這將工作

+0

重讀這個問題和其他答案:包括C文件導致鏈接器錯誤。 – manuell