做翻譯兼職的網(wǎng)站焊工培訓(xùn)內(nèi)容有哪些
1.外部變量
如果一個(gè)變量除了在定義它的源文件中可以使用外,還能被其他文件使用,那么就稱這個(gè)變量為外部變量。命名空間作用域中定義的變量,默認(rèn)情況下都是外部變量,但在其他文件中如果需要使用這一變量,需要用extern關(guān)鍵字加以聲明。請看下面的例子:
源文件1如下:
int i = 3;//定義變量i
源文件2如下:
extern int i;//聲明一個(gè)在其他文件中的定義的外部變量iint main()
{i++;cout << i << endl;return 0;
}
運(yùn)行結(jié)果:
結(jié)果分析:
上述程序中,雖然i定義在源文件1中,但由于源文件2中用extern關(guān)鍵字聲明了變量i,因此在源文件2中同樣可以使用它。外部變量是可以為多個(gè)源文件所共享的全局變量。
對外部變量的聲明可以是定義性聲明,即在聲明的同時(shí)定義(分配內(nèi)存,初始化),也可以是引用性聲明(引用在別處定義的變量)。在命名空間作用域中,不用extern關(guān)鍵字聲明的變量,都是定義性聲明;用extern關(guān)鍵字聲明的變量,如果同時(shí)指定了初值,則是定義性聲明,否則是引用性聲明。
例如上述源文件1中聲明變量的同時(shí)也是對i的定義,源文件2中對i的聲明只是引用性聲明。外部變量可以有多處聲明,但對變量的定義性聲明只能是唯一的。
2.外部函數(shù)
在所有類之外聲明的函數(shù)(也就是非常成員函數(shù)),都具有命名空間作用域的,如果沒有特殊說明,這樣的函數(shù)都可以在不同的編譯單元中被調(diào)用,只要在調(diào)用之前進(jìn)行引用性聲明(即聲明函數(shù)原型)即可。當(dāng)然也可以在聲明函數(shù)原型或定義函數(shù)時(shí)用extern修飾,其效果與不加修飾的默認(rèn)狀態(tài)是一樣的。
【注意】通常情況下,變量和函數(shù)的定義都放在源文件中,而對外部變量和外部函數(shù)的引用性聲明放在頭文件中。
【例】:
頭文件:
#pragma once
extern int i;
extern void next();
源文件
int i = 3;void other()
{i++;
}
void next()
{i++;other();
}int main()
{i++;next();cout << i << endl;return 0;
}
運(yùn)行結(jié)果:
3.將變量和函數(shù)限制在編譯單元內(nèi)
命名空間作用域中聲明的變量和函數(shù),在默認(rèn)情況下都可以被其他編譯單元訪問,但有時(shí)并不希望一個(gè)源文件中定義的命名空間作用域的變量和函數(shù)被其他源文件引用。這種需求主要出于兩個(gè)原因,一是出于安全性考慮,不希望將一個(gè)只會(huì)在文件內(nèi)使用的內(nèi)部變量或函數(shù)暴露給其他編譯單元,就像不希望暴露一個(gè)私有成員一樣;二是對于大工程來說,不同文件之中的、只在文件內(nèi)使用的變量名很容易重名,如果將它們都暴露出來,在連接時(shí)很容易發(fā)生名字沖突。
對于這一問題,之前的解決辦法是在定義這些變量和函數(shù)時(shí)用static關(guān)鍵字。static關(guān)鍵字用來修飾命名空間作用域的變量和函數(shù)時(shí),和extern關(guān)鍵字起相反的作用,static關(guān)鍵字會(huì)使得被static修飾的變量和函數(shù)無法被其他編譯單元引用。
【注意】static的3中用法,當(dāng)它在局部作用域、類作用域和命名空間作用域時(shí),具有不盡相同的作用。一個(gè)共同點(diǎn)是,凡是被static關(guān)鍵字修飾的變量,不管它們在未使用static關(guān)鍵字時(shí)它們的生存期如何,在被static關(guān)鍵字修飾之后都有靜態(tài)生存期。
在IOS C++ 2.0標(biāo)準(zhǔn)中宣布不在鼓勵(lì)用static關(guān)鍵字解決不把變量和函數(shù)暴露給其他編譯單元這一問題。取而代之的是使用匿名的命名空間。在匿名命名空間中定義變量和函數(shù),都不會(huì)暴露給其他編譯單元。例:
namespace //匿名命名空間
{int i;void f(){i++;}
}
【注意】應(yīng)當(dāng)不希望被其編譯單元引用的變量和函數(shù)放在匿名命名空間中