2017-02-11 10 views
0

const変数が外部から参照される(つまり、外部リンケージを持つ)ためには、externキーワードは必須です。それが正しい場合constグローバルのexternをスキップしても正常に動作する

const int f = 3; // Definition of f with internal linkage (due to const) 
extern const int g; // Declaration of g with external linkage 

は、その後、次のことがまだ正常に動作しない方法::だからs1.cppで を私は宣言しexternなしconst int a=9を初期化しています

s1.cpp

#include<iostream> 
#include"h1.h" 
using namespace std; 

//This is a global variable 
const int a=9; // No Extern here 

int main() 
{ 
     cout<<a; 
     something(); 
     return 0; 
} 

h1.h

#ifndef H1_H 
#define H1_H 
extern const int a; //this extern is anyways required 
void something(); 
#endif 

ただし、ここではs2.cpp icですまだアクセスa問題なし。

s2.cpp

#include<iostream> 
#include"h1.h" 
using namespace std; 


void something() 
{ 
     cout<<"Inside something its : "<<a; //No problem here. Why? 
} 

誰かが明確にしてくださいことはできますか?

私はLinuxの gccのバージョン4.4.6 20120305(Red Hatの4.4.6-4)(GCC)としてコンパイル

上でそれを実行しました:

アウト G ++ s1.cpp s2.cpp -o出力形式: 9Inside something its:9indlin1738!

+0

可能な重複enのソースファイルをC?](http://stackoverflow.com/questions/1433204/how-do-i-use-extern-to-share-variables-between-source-files-in-c) – LogicStuff

+0

する必要があります**あなたのコンパイラとあなたのビルドコマンド**を指定してください。さもなければ、その挙動は確実に再現可能ではない。 –

+0

再現可能な例がないと投票する(上記のコメントを参照)。 –

答えて

2

あなたはs1.cpph1.hが含まれているためこれは、あなたが何か持っているので、(あなたの質問について)、次のとおりですので、aは外部リンケージを持つように宣言され、その後に定義されており、ここでは初期化されていることを意味し

extern const int a; 
const int a = 9; 

aだけh1.hを含み、他のモジュールs2.cppに、見えるようになります。[どのように私は、変数のbetweを共有するためにはexternを使用しないの

extern const int a; 
+0

それでは、どのシナリオで、externキーワードを前に付けると、エラーがスローされますか? – anurag86

関連する問題