1. 程式人生 > >標頭檔案中只能宣告變數不能定義變數 而宣告變數必須帶extern,為什麼標頭檔案中變數的宣告都沒有加

標頭檔案中只能宣告變數不能定義變數 而宣告變數必須帶extern,為什麼標頭檔案中變數的宣告都沒有加



1.標頭檔案中不可以放變數的定義!一般標頭檔案中只是放變數的宣告,因為標頭檔案要被其他檔案包含#include,如果把定義放在標頭檔案的話,就不能避免多次定義變數。C++不允許多次定義變數,一個程式中對指定變數的定義只有一次,宣告可以無數次。
三個例外:1)值在編譯時就已知的const變數的定義可放在標頭檔案中,如:const int num=10;
          2)類的定義可放在標頭檔案中。
          3)inline函式。
2.定義和宣告是不同的。定義只能出現一次,而宣告可以出現多次。
下面的語句是定義,不能放在標頭檔案中:
extern  int ival=10; //雖然ival宣告為extern,但是它初始化了,代表這是個定義。
double fica_rate;  //fica_rate雖然沒有初始化,但是沒有extern。所以仍是定義。

3.在多個C檔案的程式中,想在標頭檔案中宣告定義幾個變數,如果給宣告的變數賦值,則提示重複定義,在宣告的變數前加extern只對變數進行宣告,可是在什麼地方給變數賦值呢??
答:加了extern後,就可以在其他任何引用此檔案的地方來進行賦值的。比如說,可在主檔案中進行賦值。

4.  extern int x; //變數是宣告,並未實際分配地址。
    void print(); //函式宣告,並未產生實際目的碼
    如:int x; int x=3; void print() { }; //均為定義。

5。只有全域性變數並且沒有被static宣告的變數才能宣告為extern。所以,如果你不想自己原始檔中全域性變數被其他檔案引用,你就可以給變數加上static宣告。
    定義也是宣告。C++中有個關鍵字用來宣告變數的,即extern。它宣告一個變數,而不定義它。
    注意:在C++中,變數有且只能有一次定義,但是可以宣告多次。
    舉例說明:假設在檔案1.cpp中定義了一個全域性變數bufsize,檔案1.cpp中當然能訪問它,如果我想在檔案2.cpp中訪問這個全域性變數,這時候需要在檔案2.cpp中宣告這個變數。
    //1.cpp
    int  bufsize;
    //2.cpp
    extern int bufsize;
這裡說的是非const的全域性變數,如果是const的全域性變數,如果想被其他檔案訪問,需要在定義時,加上extern關鍵字,表示它可被其他檔案宣告使用的。否則的話,這個變數只能在它被定義的檔案裡面被訪問,其他檔案不能訪問。
    //1.cpp
    extern const int  bufsize=10;
    //2.cpp
    extern const int bufsize;
    為什麼非const變數定義時候沒有extern??答:非const變數預設為extern,const變數預設為檔案的區域性變數。而const變數如果想在其他檔案裡被訪問,必須顯示的指定它為extern。標題答案在這裡

6. C++標準並沒有規定標頭檔案中不能定義變數,只不過如果在標頭檔案中定義變數,而該標頭檔案又被多次包含的話,會造成變數的重新定義。

7. 例如:在test.c檔案中定義變數int global=0;
可以在標頭檔案test.h中宣告這個變數為extern int global;
要使用這個變數的其他檔案,只要包含test.h就可以了。

8. static全域性變數是有檔案作用域的。在a.c中用了,在其他檔案中就不能使用了。static變數一般放在.cpp或者.c檔案中。不放在.h檔案中。

9. 在某一個.c檔案中定義:int num=0;
   在.h檔案中宣告:extern int num;

10. #ifndef、、、#define、、、#endif
可以保證在一個檔案裡只是定義一次。
比如:a.h引用b.h, c.cpp同時引用a.h和b.h。這樣,#ifndef、、、#define、、、#endif可以保證c.cpp裡的b.h只被引用一次。

注意:要把標頭檔案的內容都放在#ifndef和#endif中。不管標頭檔案會不會被多個檔案引用,都要加上這個。
一般的格式:
#ifndef <標識>
#define <標識>
、、、、
、、、、
#endif
<標識>理論上說可以自由命名。但是每個標頭檔案的這個“標識”都應該是唯一的。標識的命名規則一般是標頭檔案名全大寫,前後加下劃線,並把檔名中.也變成下劃線。如:stdio.h
#ifndef _STDIO_H_
#define _STDIO_H_
、、、
#endif

程式示例:
//a.h
#ifndef A
#define A

bool AorB(bool a)
{
   return a;
}
#endif

//b.h
#include "a.h"
bool CorD(bool a)
{
   return AorB(a);
}

//a.cpp
#include "a.h"
#include "b.h"
int main()
{
   bool a=0;
   bool b=AorB(a);
   bool c=CorD(b);
 
   getchar();
   return 0; 
}

相關推薦

檔案只能宣告變數不能定義變數 宣告變數必須extern為什麼檔案變數宣告有加

 1.標頭檔案中不可以放變數的定義!一般標頭檔案中只是放變數的宣告,因為標頭檔案要被其他檔案包含#include,如果把定義放在標頭檔案的話,就不能避免多次定義變數。C++不允許多次定義變數,一個程式中對指定變數的定義只有一次,宣告可以無數次。 三個例外:1)值在編譯時

ReactNative如何在JS引用原生自定義控件(rn變化太快網上很多教程有坑這個我研究後可用特意分享)

not net boolean button nag instr 自定義控件 col 朋友 直接寫一個Demo例子,有相關功底的肯定明白,會對特別的地方進行提醒,本文基於https://blog.csdn.net/lintcgirl/article/details/5348

IDEAMaven專案POM檔案的依賴未報錯(出現紅色波浪線)但Maven Projects的模組的Dependencies的依賴卻報錯

問題描述:   IDEA中,Maven專案POM檔案中的依賴未報錯(出現紅色波浪線),但Maven Projects中模組的Dependencies依賴卻報錯。 問題出現的場景:   將本地Maven倉庫的地址從C盤更換到其他盤,新倉庫中jar包存在。 問題分析:   1、

CF D - Beautiful Graph(dfs 染色問題吧)給你一個圖每個節點可以賦值1,2,3三種數字相鄰的節點的和必須是奇數問有多少方法。

題意: 給你一個圖,每個節點可以賦值1,2,3三種數字,相鄰的節點的和必須是奇數,問有多少中方法。 分析: 很容易就可以發現如果這個圖中是有奇數的環的話,那這是肯定不行的 ,否則這個環的貢獻是為2^sumji+2^sumou , 總貢獻為每個的環的貢獻相乘,一個點也為環; #in

解決VMWare“二進位制轉換與此平臺上的長模式不相容此虛擬環境的長模式將被禁用”問題

    【轉自】http://blog.sina.com.cn/s/blog_63b15fc901019wkn.html 在使用Windows7 64位作業系統時,無法執行VMWare或MS Virtual server等軟體虛擬作業系統。提示為“提示:軟體虛擬化與此平臺上的長模式不相容. 禁用長模式.

【轉】解決VMWare“二進位制轉換與此平臺上的長模式不相容此虛擬環境的長模式將被禁用”問題

    【轉自】http://blog.sina.com.cn/s/blog_63b15fc901019wkn.html 在使用Windows7 64位作業系統時,無法執行VMWare或MS Virtual server等軟體虛擬作業系統。提示為“提示:軟體虛擬化與此平

const變數定義檔案

一。、首先要知道強弱符號 編譯器編譯原始檔時會把原始檔的全域性符號(global symbol)分成強(strong)和弱(weak)兩類傳給彙編器,     而隨後彙編器則將強弱資訊編碼並儲存在目標檔案的符號表中。     那麼何謂強弱呢?編譯器認為函式與初始化了的全域性

Static修飾的變數定義檔案(.h)的影響

static修飾的全域性變數的作用範圍會被限制在宣告的原始檔內。舉個例子, a.cb.cc.h其中c.h被a.c,b.c引用, 而且c.h中定義了:static int test = 0;在編譯的時候,a.c會和c.h一起編譯, 然後b.c也會和c.h一起編譯, 但是要注意,

關於字元驅動變數巨集檔案等的簡介 module_init module_exit

  ssize_t second_drv_read(struct file *file, char __user *buf, size_t size, loff_t *ppos) { } 這是一個檔案讀函式  ssize_t是signed size_t,size_t是標準C庫中定義的

c++模板類的成員函式的宣告定義應該放在檔案

    今天嘗試自己實現vector資料結構底層,在定義vector模板類的時候,還想像往常一樣把類分為.h檔案和.cpp檔案,把成員函式的宣告放在.h檔案中,把具體實現放在.cpp檔案中,結果在測試時發現在編譯過程中報錯。除錯了很久,重視提示“無法解析的外部符號”,如圖所示

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

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

error LNK2005 --類的宣告定義放在一個檔案

刷C++primer的時候,將類的宣告和定義均放在標頭檔案中,報錯error LNK2005 1> Sales_data.h 1>Sales_data.obj : error LNK2005: "public: class Sales_data & __this

C++的全域性變數宣告定義

1.全域性變數 全域性變數在整個原始檔的作用域都是有效的,只需要在一個原始檔中定義全域性變數,在其他不包含全域性變數定義的原始檔中用extern關鍵字再次宣告這個全域性變數即可。 也可以在一個原始檔中定義這個全域性變數,在標頭檔案中用extern關鍵字再次宣告這個全域性變數,如果其它原始檔要

C變數宣告定義

在C中,變數的定義主要可分為兩種狀況:在函式內和在函式外。 但變數在函式內定義時,其屬性只能分為static和無static,而該變數便無法被外部函式所引用。而定義為static時表示該變數只能用來初始化一次。 而變數在函式外定義時,其屬性也只能分為static和exter

C語言變數和函式的宣告定義

一、變數在將變數前,先解釋一下宣告和定義這兩個概念。宣告一個變數意味著向編譯器描述變數的型別,但並不為變數分配儲存空間。定義一個變數意味著在宣告變數的同時還要為變數分配儲存空間。在定義一個變數的同時還可以對變數進行初始化。 區域性變數通常只定義不宣告,而全域性變數多在原始檔中定義,在標頭檔案中宣告。 區域性變

static成員變數定義宣告

類中static成員變數的定義和宣告:在VS2010中,只能在類外定義同時賦值,在類中宣告。不能再類中宣告時賦值!! #include<iostream> using namespace std; class A { public: static int a

c++利用巨集來宣告定義變數

假設我們要定義一個配置類,類中包含了很多的配置成員,有一種通過巨集的方法可以讓我們方便的維護繁多的成員 在一個類中,定義一個變數需要型別,建構函式中給出的初始值。我們需要能夠像指令碼語言一樣進行配置變數: tconfig.h OPTION(m_data,OPT_INT,-1) OPTION(m_value

【C++】C++變數宣告定義的區別

宣告(declaration):意味著告訴編譯器關於變數名稱、變數型別、變數大小、函式名稱、結構名稱、大小等等資訊,並且在宣告階段不會給變數分配任何的記憶體。 定義(definition):定義就是在變數聲明後,給它分配上記憶體。可以看成“定義 = 宣告 + 記憶體分配”。 例如: #includ

C++模板宣告定義是否可以分開存放在.h和.cpp檔案

        雖然我們遇到的絕大多數情況下,模板中函式的宣告和定義都放在標頭檔案中,但我想肯定有人和我一樣,想知道是否可以分開存放。動手實驗後,會發現有的可以,有的會報錯,其實,這和編譯器有關。         要弄清楚這個問題,首先要解決兩個問題。         第一

C語言變數宣告定義

變數宣告和變數定義變數定義:用於為變數分配儲存空間,還可為變數指定初始值。程式中,變數有且僅有一個定義。變數宣告:用於向程式表明變數的型別和名字。定義也是宣告,extern宣告不是定義定義也是宣告:當定義變數時我們聲明瞭它的型別和名字。extern宣告不是定義:通過使用ext