国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

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

2020-01-26 13:46:30
字體:
來源:轉載
供稿:網(wǎng)友

前言

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

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

遇到的問題

我的做法是:

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

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


問題出現(xiàn)的原因

為什么會出現(xiàn)這種情況呢?

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

不是辦法的辦法

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

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

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

真正的解決方法

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

我的個人想法

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

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

結言

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠来县| 关岭| 雷山县| 衢州市| 和顺县| 定襄县| 珠海市| 襄汾县| 营山县| 连城县| 吕梁市| 沁阳市| 富阳市| 封开县| 光山县| 壤塘县| 卫辉市| 晴隆县| 视频| 西宁市| 合川市| 上高县| 湘阴县| 汪清县| 崇礼县| 固镇县| 玛沁县| 赣榆县| 新巴尔虎右旗| 贵溪市| 平罗县| 曲沃县| 定安县| 彩票| 象州县| 郴州市| 新泰市| 岳西县| 连城县| 美姑县| 镇江市|