日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

解决C/C++语言中全局变量重复定义的问题

發(fā)布時間:2025/3/15 c/c++ 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决C/C++语言中全局变量重复定义的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

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


遇到的問題

我的做法是:

  • 宏定義、結(jié)構(gòu)體定義、函數(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為這些全局變量分配了內(nèi)存空間,而在main.obj中也為這些全局變量分配了內(nèi)存空間。
  • 同樣一個變量卻出現(xiàn)了兩個不同的內(nèi)存地址。于是編譯器報錯。

  • 不是辦法的辦法

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

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

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


    真正的解決方法

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

  • 我的個人想法

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

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

  • 結(jié)言

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

    文章出自kwongtai'blog,轉(zhuǎn)載請標(biāo)明出處

    轉(zhuǎn)載于:https://www.cnblogs.com/kwongtai/p/8366907.html

    總結(jié)

    以上是生活随笔為你收集整理的解决C/C++语言中全局变量重复定义的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。