2014-03-25 33 views
3

我不知道這個問題屬於什麼,請花點時間閱讀。它涉及C和C++的區別以及編寫代碼的習慣;代碼如下: 我把它分成3個文件; 會在main.c以及安排代碼的習慣

#include"myh.h" 
    unit_t *paa; 
    int main() 
    { 
     paa=(unit_t*)malloc(sizeof(unit_t)); 
     if(paa==NULL){ 
     printf("out of memory\n"); 
     exit(1); 
     } 

     fuzhi(paa); 
     printf("hello !%d",paa->number); 
     free(paa->msg); 
     free(paa); 
     paa=NULL; 
     return 0; 

    } 

anohter C:ke.c

#include"myh.h" 
void fuzhi(unit_t* pa) 
{ 
    pa->number=3; 
    pa->msg=(char *)malloc(20); 
    printf("fuzhi !"); 

} 

的.h文件:myh.h

#ifndef P_H 
#define P_H 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 

typedef struct{ 
     int number; 
     char *msg; 
}unit_t; 
void fuzhi(unit_t* pa); 
int a; 

#endif 

所以,問題是,當我運行用C代碼它沒有問題,但是當我將它保存爲cpp時,錯誤是'a'的多重定義;爲什麼? 第二個問題是我不知道我安排的代碼好壞的習慣。有人給我一些很好的建議嗎?當代碼很大時,我通常會將聲明放在h文件中,並使用c/cpp寫入函數的定義。然後使用主c/cpp來滿足主要功能。有人能給我一些關於編寫代碼的好建議嗎,我是一個新的學習者。 謝謝。

回答

10

你必須記住的第一件事是C和C++是不同的語言,所以對全局聲明的變量有不同的規則。而你有多次定義的全局變量a:一次在main.c文件中,一次在ke.c文件中。

這是因爲你的定義了頭文件中的變量,它包含在你的兩個源文件中。你應該做的是聲明頭文件中的變量,然後定義它在一個單一的源文件。

例如,在頭文件你應該有

extern int a; 

而在一個源文件:

int a; 
+1

除非全局變量是一個C++對象,我沒有看到C和C++會有什麼不同? – Lundin

+0

代碼風格如何?現在我通常使用3部分代碼進行編碼,當項目很大時,我需要一種風格來安排我的代碼。可以給我一些建議。謝謝。 – Fanl

+0

@Lundin在C中查找*暫定義* –

1

編譯過程如下:

對於每個C。或.cpp文件(稱爲compilands):

  • 預處理文件,解決所有宏,#包括,等...
  • 編譯文件,產生的目標文件的.o。目標文件包含機器代碼,但非本地變量仍由名稱引用。

那麼,在年底鏈接的所有目標文件,其中包括:

  • 解決所有非本地變量名
  • 取代那些地址

在你情況下,你有兩個compilands:main.c和ke.c.

在預處理過程中,都包含.h文件。因此,兩個compilands都聲明瞭一個全局變量int a。每個compiland都使用它自己的全局變量副本。

然後,鏈接器嘗試解析名稱,並且很驚訝地看到兩個目標文件在同一個名字下定義了兩個變量。


爲了解決它,在C++頭使用關鍵字「外部」:

extern int a; 

這表明將有一個全局變量a,但它不定義它(類似的功能無定義的聲明)。在compilands之一,你則需要重複正常int a定義,但在不被其他compilands看到的地方(也就是 - 在頭)