2014-04-02 14 views
0

經歷的RPC教程在MSDN, 我剛剛創建了一個項目有兩個.c文件如下::「在目標文件中定義」和「一個或多個多重定義符號找到」

/* file hellop.c */ 
#include <stdio.h> 
#include <windows.h> 

void HelloProc(char * pszString) 
{ 
    printf("%s\n", pszString); 
    return ; 
} 

/* file: hello.c */ 
#include "hellop.c" 

void main(void) 
{ 
    char * pszString = "Hello, World"; 
    HelloProc(pszString); 
    return ; 
} 

問題::錯誤LNK2005和致命錯誤LNK1169

爲什麼和編譯器在哪裏看到HelloProc(char*)的多個符號定義或聲明?

編輯::正如在這SO_Question,包括.h文件中得出的結論顯然是最好的解決方案。但是,這是否讓我們沒有實現設計,我們可以將.c文件包含到另一個.c文件中?

奇怪的行爲::首次編譯運行正常,但重建解決方案與上述錯誤。您可以通過將文件名從.c更改爲.cpp來檢查多次首次編譯,反之亦然。爲什麼會出現這種行爲? (我不知道其他人也遇到過與給定的例子)

回答

2

您編譯HelloProc兩次,因爲你包括在hello.c文件這一功能的全高清通過#include "hellop.c",而你只需要它的聲明。你應該把函數原型放在頭文件中。

 #ifndef HELLOP_H 
    #define HELLOP_H 

    #include <stdio.h> 
    #include <windows.h> 

    void HelloProc(char * pszString); 

    #endif 

,包括頭文件都在hellop.chello.c

編輯:#include沒有剪切粘貼就像你說的,更復制粘貼

#包括「Q- char-sequence「new-line

導致用指定序列b標識的 源文件的全部內容替換該指令切口白內障手術挽了「 定界符

所以你得到的HelloProc一個在hellop.c兩個定義,另一個在hello.c到聯動。解決這個問題的另一種方法是隻編譯hello.c文件,這樣就沒有HelloProc的重複。看看如何在Visual Studio中做到這一點here

+0

欣賞你的答案,但我不認爲這是這裏的問題。另外,我沒有任何「main.c」文件,它是「hello.c」:-)。然而,我知道,將這個聲明放在一個頭文件中會很棒,但我想知道背後的原因。 「#include」就像剪切粘貼的東西(粗略地說),那麼這個錯誤不應該發生。 – Abhineet

+0

@Abhineet看到我的編輯 – Dabo

+0

是的,對不起,我打算說「複製粘貼」的課程。 – Abhineet