中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C/C++語言中全局變量重復定義問題的解決方法

發布時間:2020-09-05 22:09:03 來源:腳本之家 閱讀:698 作者:kwongtai 欄目:編程語言

前言

在C語言中使用extern 關鍵字來定義全局變量的時候,我們需要在.h文件和.c文件中重復定義,這種重復,導致了出錯幾率的增加。

今天,在整理自己的代碼的時候,考慮到我寫的代碼從一至終都是在一個cpp文件里面。于是,想把自己的代碼中的各個模塊分離開來,以便更好地閱讀和管理。

遇到的問題

我的做法是:

  • 宏定義、結構體定義、函數聲明以及全局變量定義放到一個head.h頭文件中
  • 函數的定義放到head.cpp中
  • main函數放到main.cpp中

然而卻報錯了,提示xxx變量在*.obj文件中已定義

C/C++語言中全局變量重復定義問題的解決方法

問題出現的原因

為什么會出現這種情況呢?

  • 首先單個文件的編譯是獨立的。在head.cpp編譯到head.obj,main.cpp編譯到main.obj。這個過程沒有報錯,也就是說明編譯過程是沒有問題的。
  • 接下來是obj的鏈接。在鏈接main.obj與head.obj的時候,此時編譯器發現head.obj為這些全局變量分配了內存空間,而在main.obj中也為這些全局變量分配了內存空間。
  • 同樣一個變量卻出現了兩個不同的內存地址。于是編譯器報錯。

不是辦法的辦法

把head.h里面的頭文件的全局變量都加上static。編譯便可通過,可是卻會不經意出現了其他問題。

static只是把變量的生存周期延長,同時也把該變量限定于當前的文件。而之所以能用于main.cpp中,是因為在編譯的時候復制了一個變量名相同的變量給main.cpp而已。那么main.cpp里面的“全局變量”的改變,并不能改變原來head.h里面的全局變量的值。

這樣子雖然編譯通過了,但是程序是錯誤的。

真正的解決方法

  • 把全局變量定義放到head.cpp文件中。
  • 在head.h存放全局變量的聲明,同時每個聲明前用 extern 去修飾。

我的個人想法

我覺得為了能更加分離全局變量,可以做的一個做法是:

  • 全局變量定義依舊放在head.cpp中。
  • 新建一個global.h的頭文件,存放全局變量的聲明,同時每個聲明前用 extern 去修飾。
  • 在其他文件需要用到全局變量的時候,將global.h頭文件#include進來。

結言

這個問題的出現,很大原因是C語言太久沒有使用過了。而且,在使用c語言或者c++語言的時候,往往因為實驗以及課設所需要寫的代碼不太多,于是養成了一種習慣,一個main.cpp寫到結尾。當真正自己去分離自己的模塊代碼的時候,發現因為定義的全局變量導致編譯鏈接出現錯誤,實屬不該。故寫下此文警惕自己!文中可能有不對的地方,希望大家能指正!

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宁波市| 文昌市| 河池市| 巴里| 田阳县| 诏安县| 江华| 新丰县| 汉阴县| 滁州市| 阳新县| 比如县| 白朗县| 尖扎县| 肃宁县| 新河县| 邵武市| 文安县| 嘉祥县| 阳谷县| 玉龙| 泸州市| 昭平县| 沙湾县| 连山| 历史| 玉溪市| 凤凰县| 镶黄旗| 景泰县| 鹿邑县| 晋城| 镇平县| 综艺| 松滋市| 澄城县| 鄄城县| 大新县| 郎溪县| 成都市| 大洼县|