1. 程式人生 > >multiple definition of 變數重複定義

multiple definition of 變數重複定義

# vi test.c
-------------------------------
#include <stdio.h>
#include "test.h"
extern i;
extern void test1();
extern void test2();
int main()
{
   test1();
   printf("ok/n");
   test2();
   printf("%d/n",i);
   return 0;
}
# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_
char add1[] = "www.shellbox.cn/n";
char add2[] = "www.scriptbox.cn/n";
int i = 10;
void test1();
void test2();
#endif
# vi test1.c
-------------------------------
#include <stdio.h>
#include "test.h"
extern char add1[];
void test1()
{
   printf(add1);
}
# vi test2.c
-------------------------------
#include <stdio.h>
#include "test.h"
extern char add2[];
extern i;
void test2()
{
   printf(add2);
   for (; i > 0; i--)
       printf("%d-", i);
}
# Makefile
-------------------------------
test:    test.o test1.o test2.o
test1.o: test1.c
test2.o: test2.c
clean:
   rm test test.o test1.o test2.o
錯誤:

test-1.0編譯後會出現"multiple definition of"錯誤。
錯誤分析:
由於工程中的每個.c檔案都是獨立的解釋的,即使標頭檔案有
#ifndef _TEST_H_
#define _TEST_H_
....
#enfif
在其他檔案中只要包含了global.h就會獨立的解釋,然後每個.c檔案生成獨立的標示符。在編譯器連結時,就會將工程中所有的符號整合在一起,由於檔案中有重名變數,於是就出現了重複定義的錯誤。
解決方法
.c檔案中宣告變數,然後建一個頭檔案(.h檔案)在所有的變數宣告前加上extern,注意這裡不要對變數進行的初始化。然後在其他需要使用全域性變數的.c檔案中包含.h檔案。編譯器會為.c生成目標檔案,然後連結時,如果該.c檔案使用了全域性變數,連結器就會連結到此.c檔案

test-2.0
# vi test.c
-------------------------------
#include <stdio.h>
#include "test.h"
int i = 10;
char add1[] = "www.shellbox.cn/n";
char add2[] = "www.scriptbox.cn/n";
extern void test1();
extern void test2();
int main()
{
   test1();
   printf("ok/n");
   test2();
   printf("%d/n",i);
   return 0;
}
# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_
extern i;
extern char add1[];
extern char add2[];
void test1();
void test2();
#endif

# vi test1.c
-------------------------------
#include <stdio.h>
#include "test.h"
void test1()
{
   printf(add1);
}
# vi test2.c
-------------------------------
#include <stdio.h>
#include "test.h"
void test2()
{
   printf(add2);
   for (; i > 0; i--)
       printf("%d-", i);
}

相關推薦

multiple definition of 變數重複定義

# vi test.c ------------------------------- #include <stdio.h> #include "test.h" extern i; extern void test1(); extern v

c語言重複定義 multiple definition of `Recusion'

c語言重複定義。。。。 我在標頭檔案(.h)中定義聲明瞭一個變數 int Recusion = 0;/*0,1*/ 然後在兩個.cpp檔案中使用 a.cpp -------------------------- Recusion = 1; b.cpp

【C++】變數定義在.h標頭檔案導致 multiple definition of 的解決方法和根本原因

說明:出現這個錯誤,請你先檢查重複定義的變數是否是定義在了.h標頭檔案中,如果是,請您耐心的看完這篇文章,他會告訴你錯誤的根本原因。 如果你很著急,不想弄清楚原因,請直接按下面的方法更改: 假設重複定

全域性變數 multiple definition of 問題解決方法

解決方法:1.給每一個頭檔案加上條件編譯:注:此方法不是解決上述問題的方法,只是解決multiple definition of的一個方法。 當多個檔案包含同一個標頭檔案時,而標頭檔案中沒有加上條件編譯,就會獨立的解釋,然後生成每個檔案生成獨立的標示符。在編譯器連線時

解決C++編譯出現的重定義問題:multiple definition of ’XXX‘錯誤

1 //file_NO2:hello.cpp 2 #include<iostream> 3 #include"hello.h" 4 using namespace std;

multiple definition of變數或者函式)

今天在公司寫專案的時候,遇到如下錯誤,半個小時了,沒看出來問題出在哪裡~我看了好幾遍程式碼,確認沒有重定義,後來問旁邊的大牛,才發現自己手誤,錯吧#include “area.h”寫成#include"

multiple definition of `qMain(int, char**)'

發現 image com init tip 項目文件 efi 生成 天發 QT C++ 我上一分鐘運行地好好的,下一分鐘就無法通過編譯了。查了半天發現在IDE自動生成的項目文件.pro中 main竟然包含了兩遍。我對這表示很無語,我完全是通過IDE來操作,卻產生一些我不易察

Qt提示 multiple definition of `SystemMenuButton::SystemMenuButton(QWidget*)

為了防止以後編碼出現類似得錯誤,在這裡記錄下-------------------------------------------- 錯誤提示: F:\shined-PC(488AD2092F21)\build-InformationDelivery-Desktop_Qt_5_5_1_Min

C++ 惱人的multiple definition of X連結錯誤

1. 錯誤原因 首先查了一下C&C++從原始碼編譯到可執行檔案的過程: 1)預處理將偽指令(巨集定義、條件編譯、和引用標頭檔案)和特殊符號進行處理 2)編譯過程通過詞法分析、語法分析等步驟生成彙編程式碼的過程,過程中還會進行優化 3)彙編過程將彙編程式碼翻譯為目標機器指令的過

報錯:multiple definition of 和 first defined here

1、就只有一處定義了全域性變數,但還是報錯,提示重複定義。 2、檢查.h標頭檔案,已經避免重複包含了。 解決方法: 在.c程式中定義全域性變數,在.h檔案中使用extern 做外部宣告,供其他檔案呼叫。 參考連結: https://blog.csdn.net/manti

解決C/C++語言中全域性變數重複定義的問題

前言 今天,在整理自己的程式碼的時候,考慮到我寫的程式碼從一至終都是在一個cpp檔案裡面。於是,想把自己的程式碼中的各個模組分離開來,以便更好地閱讀和管理。 遇到的問題 我的做法是: 1. 巨集定義、結構體定義、函式宣告以及全域性變數定義

標頭檔案重複包含和變數重複定義

在c或c++中,標頭檔案重複包含問題是程式設計師必須避免的問題,也是很多新手容易犯錯的問題。為什麼要避免標頭檔案重複包含呢?        1.我們知道在編譯c或c++程式時候,編譯器首先要對程式進行預處理,預處理其中一項工作便是將你源程式中#include的標頭檔案完整的展

keil 中建立多檔案時,變數重複定義的解決

     c/c++語言中有很多地方要用到extern,但是如果沒有真正的瞭解它的意義,會給程式設計帶來很大的麻煩,為了使大家少走彎路,特祥細的說明一下。     對於比較小的程式,一般只有一個c檔案和一個頭檔案,全域性變數我們通常會直接定義在c檔案中,在程式之前加int i定義。如果要在標頭檔案中定義有以下

解決 multiple definition of 問題

原因:多個檔案包含同一個標頭檔案且標頭檔案.h沒有加上條件編譯。因為每個.h標頭檔案被編譯生成獨立的標示符,編譯器連結時就出現了重複定義的錯誤。 Methon 1:為每個標頭檔案加上條件編譯,避免該檔案多次引用時被多次解釋。 #ifndef TEST_H #

[C語言專案]防止標頭檔案和全域性變數重複定義

昨天下午將全域性變數定義在H檔案中導致連結時提示變數在多個obj檔案內重複。 解決辦法如下: 將變數移入C檔案中進行定義,然後在H檔案中加入extern在變數之前。 這樣當其它C檔案引用該全域性變數時就會去連結這個變數符號而不是重新生成。 另附防止H檔案被重複包含的處理方

如何解決linux下編譯出現的multiple definition of錯誤

今天,在編譯quagga的過程中出現了multiple definition of的錯誤。該錯誤表示不同檔案對同一變數進行了重複定義。因此,可以從以下幾個方面來排查這個問題: 1. 是否定義了重複變數: 直觀來講,如果在已經引用的global.h中定義了變數v,那麼在本檔案

檔案編譯時出現multiple definition of `xxxxxx'的解決辦法

問題: 原來有單個檔案tcpclient.c,執行gcc -o tcpclient tcpclient.c可以順利完成編譯,並能與下載到目標板中的tcpserver成功通訊; 現在把tcpclient.c中的底層通訊部分抽取出來,單獨放到一個檔案中nettrans.c中,並

防止全域性變數重複定義

問題: 在.h檔案中定義了全域性變數 並用 #ifndef identifier_h #define identifier_h .... #endif 但是依然出現重複定義問題 分析: ifndef這套條件編譯是為了防止同一個.c檔案中包含多個相同.h檔案的(比如有一個.

C++ 解決 multiple definition of & previous definition here編譯錯誤

1、第一種可能是 一個函式多次重定義 應新增以下巨集定義 #ifndef TEST_H #define TEST_H #include //you code #endif 2、原始碼直接寫在標頭檔案.h裡沒有對應的.cpp檔案 需要每個函式前新增 inline

multiple definition of 問題解決方法

問題描述:有一個opt_process.h檔案,兩個.cc檔案都引用了這個.h檔案,在.h檔案中聲明瞭一些全域性變數,報錯 /tmp/ccBCSKoH.o:(.bss+0x0): multiple definition of longopts' /tmp/c