2011-09-07 52 views
1

在Visual C++中,我遇到了「致命錯誤LNK1169:找到一個或多個乘法定義的符號」,下面的代碼,如何解決這個問題,如果我想包括兩個頭文件源爲其他功能使用?visual C++ typdef結構多重定義符號問題

main.cpp 
======== 
#include main.h 
#include sub.h 

sub.cpp 
======== 
#include main.h 
#include sub.h 

sub.h 
========= 

typedef struct{ 
     char colour; 
     char name; 
}person; 

person ssss = { red, ali}; 

回答

3

你的問題是你在頭文件中定義一個變量:

person ssss = { red, ali }; 

一個在main.cpp中實例化一個在sub.cpp。你會更好地把一個:

extern person ssss; 

在頭文件,然後在一個源文件中定義一次變量。這將讓兩個源文件知道它存在,並且都會引用相同的變量,假設這是你想要的。就像其他答案所暗示的那樣,我肯定會建議使用header guards,雖然在這個例子中你並不特別需要它們,但這是一個很好的習慣,從長遠來看可以幫助你解決頭痛問題。

0

您應該在頭文件中添加包含防護,以防止多個包含相同的頭文件。

#ifndef SUB_H 
#define SUB_H 


//end of file 
#endif 

另一件事,你爲什麼包括main.h,到你的sub.cpp?這似乎是錯誤的。

0

在sub.h中,在文件頂部插入以下內容;

#pragma once 
0
person ssss = { red, ali}; 

sssssub.cpp intantiated一次,幷包含在這兩個文件的main.cpp因爲sub.h。實例化進入源文件,而不是通常的頭文件。現在,當您訪問對象ssss成員變量時,鏈接器無法訪問哪個對象,因爲它們共享相同的作用域。

解決方案是有一個單一的全局實例(如果這是你想要的),並可以通過外部鏈接跨不同的文件訪問。

main.cpp 
======== 
#include main.h  // What is main.h required for ? 
#include sub.h 

extern person ssss; 

sub.cpp 
======== 
#include main.h  // ?!?! 
#include sub.h 

person ssss = { red, ali}; 

sub.h 
========= 

typedef struct{ 
     char colour; 
     char name; 
}person; 
1

讓源文件中包含typedef應該不成問題。問題是ssss的聲明通過sub.h出現在兩個文件中。把它放在一個源文件中,並在頭文件中聲明爲外部來解決這個問題。請注意,您有一個鏈接錯誤,而不是編譯錯誤 - 這是因爲該符號在多個目標文件中找到。