1. 程式人生 > >防止全域性變數重複定義

防止全域性變數重複定義

問題:

在.h檔案中定義了全域性變數

並用

#ifndef identifier_h
#define identifier_h
....
#endif

但是依然出現重複定義問題

分析:

ifndef這套條件編譯是為了防止同一個.c檔案中包含多個相同.h檔案的(比如有一個.c檔案包含了a.h,a.h又包含了b.h,那麼當你在這個.c檔案中同時包含了a.h和b.h時,因為有上面的條件編譯的關係而不會出錯)。因為編譯器在編譯的時候是按照.c檔案為單位編譯的,每個.c檔案編譯成.o檔案(linux系統)或者.obj(windows系統),然後再將這些.o檔案連結起來,最後與執行庫連結形成可執行檔案(elf或exe檔案)。你在兩個.c檔案中包含了同一個.h檔案。這根本和條件編譯沒什麼關係。你在.h檔案中定義了全域性變數a, b, c。那麼就表示你兩個.c檔案中,每個.c檔案中都有這樣的全域性變數定義:int a, b, c;當每個.c檔案單獨編譯當然沒有問題,但是當它們連結起來的時候就出現問題了:兩個.c檔案中都有變數a b c,所以當然是重複定義啊。問題是出在連結的時候的。

解決方案:

在標頭檔案中宣告時 加入extern

在使用的檔案中定義變數 不需要加extern

相關推薦

防止全域性變數重複定義

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

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

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

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

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

防止變數重複定義、標頭檔案重複包含、巢狀包含

【轉自】 http://hi.baidu.com/zengzhaonong/blog/item/8a8871062d481f7f03088106.html #include檔案的一個不利之處在於一個頭檔案可能會被多次包含,為了說明這種錯誤,考慮下面的程式碼: #include "x.h"#include "

Python_全域性變數定義

1.在my套件下新建一個關鍵字systemkey並進行指令碼的編寫:建立一個${var1}變數,並賦值為aaaaaaaaaa Set Global Variable        ${var1}          &n

ionic3 全域性變數定義方法

在程式設計中少不了會使用到全域性變數,今天談到的是ionic3和angular4配合使用搭建app時用到的全域性變數的方式,具體的搭建方法如下: 1)直接在app中新建一個config.ts檔案    2)在需要使用全域性變數的元件中這樣引用 import {A

全域性變數定義與宣告

         例子:三個檔案:A.cpp檔案,B.cpp檔案,A.h檔案       A.cpp中:int  iLen = 100;(全域性變數的定義),這樣就可以在 A.cpp中隨便使用了;但是若想在B.cpp中使用該如何做呢? 1、在A.h標頭檔案中宣告extern

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

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

C++報錯:全域性變數定義或是多次定義

如何在C++中定義全域性變數時避免重複定義呢?只要在定義時儘量在.cpp檔案中進行,而不要在.h 檔案中定義,定義好了之後,可以在.h檔案中利用extern關鍵字進行宣告。如果在.h檔案中定義的話,

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

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

multiple definition of 變數重複定義

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

C語言中全域性變數定義與呼叫

1. 譚浩強 書中對‘全域性變數’的定義     在函式內定義的變數是區域性變數,而在函式外定義的變數叫做外部變數,外部變數是全域性變數。全域性變數可以為本檔案中其他函式所共用它的有效範圍從定義變數的位置開始到本原始檔結束。     建立全域性變數的作用是增加了函式間資料聯

解決重複包含一個頭檔案時變數重複定義的問題

#include檔案的一個不利之處在於一個頭檔案可能會被多次包含,為了說明這種錯誤,考慮下面的程式碼: #include "x.h"#include "x.h"顯然,這裡檔案x.h被包含了兩次,沒有人會故意編寫這樣的程式碼。但是下面的程式碼:#include "a.h"

fatal error LNK1169: 找到一個或多個多重定義的符號或多個.c/.cpp檔案想同時呼叫定義在.h檔案裡面的全域性變數防止定義變數問題。

為什麼.h檔案中不能定義全域性變數? 原因: 存在多次建立變數.如果標頭檔案中可以定義全域性變數,那麼每個包含該標頭檔案的檔案裡都會有該全域性變數的定義.因為C語言的include是直接將檔案嵌入到include這個地方的. 解決辦法: ​在標頭檔案使用 extern 來宣告該全域性變

vue訪問介面定義全域性變數

1.在config裡面找到dev.env.js以及prod.env.js兩個檔案,分別寫上定義的常量以及埠號,注意單引號雙引號 2. 在ajax的時候直接寫     `${process.env.URL_PATH}/app/appLogin`&

在 Vue.js專案中如何定義全域性變數&全域性函式

在專案中,經常有些函式和變數是需要複用,比如說網站伺服器地址,從後臺拿到的:使用者的登入 token, 使用者的地址資訊等,這時候就需要設定一波全域性變數和全域性函式。 目錄           定義全域性變數 定義全

在vue中多次呼叫同一個定義全域性變數的例項

在Vue開發中,有很多場景會用到多次重複的API請求。 例如: 前端精品教程:百度網盤下載 ? 1

vue中如何定義全域性變數全域性函式

定義全域性變數 原理: 設定一個專用的的全域性變數模組檔案,模組裡面定義一些變數初始狀態,用export default 暴露出去,在main.js裡面使用Vue.prototype掛載到vue例項上面或者在其它地方需要使用時,引入該模組便可。 全域性變數模組檔案: Global.v

小程式的全域性變數 定義和使用

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neu

C# winform 自定義函式中找不到Form中的控制元件和定義全域性變數

今天碰到一個比較狗血的問題,想了很多辦法,最後發現,原來如此的坑。 在新建一個form頁面後,我們在程式碼頁面寫程式碼,往往會寫自定義的方法,一般情況下,在自定義的方法中是可以找到form頁面中的控制元件和自定義的全域性變數, 但是如果我們在自定義的方法前面加了static,那麼坑就出來啦,從此這個方法好