最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?using?編譯指令與名稱沖突問題

 更新時(shí)間:2022年11月21日 10:05:51   作者:木三百川  
using?編譯指令由名稱空間名和它前面的關(guān)鍵字?using?namespace?組成,它使名稱空間中的所有名稱都可用,而不需要使用作用域解析運(yùn)算符,這篇文章主要介紹了C++?using?編譯指令與名稱沖突,需要的朋友可以參考下

using 編譯指令由名稱空間名和它前面的關(guān)鍵字 using namespace 組成,它使名稱空間中的所有名稱都可用,而不需要使用作用域解析運(yùn)算符。與 using 聲明不同的是,using 編譯指令會(huì)進(jìn)行名稱解析,在一些時(shí)候名稱空間的變量會(huì)被同區(qū)域聲明的同名變量隱藏,不會(huì)出現(xiàn)名稱沖突的報(bào)錯(cuò)。但在另一些情況下,使用 using 編譯指令仍會(huì)出現(xiàn)名稱沖突的報(bào)錯(cuò),下面對此進(jìn)行總結(jié)。

using 編譯指令:它由名稱空間名和它前面的關(guān)鍵字 using namespace 組成,它使名稱空間中的所有名稱都可用,而不需要使用作用域解析運(yùn)算符。在全局聲明區(qū)域中使用 using 編譯指令,將使該名稱空間的名稱全局可用;在函數(shù)或代碼塊中使用 using 編譯指令,將使其中的名稱在該函數(shù)或代碼塊中可用。當(dāng)包含 using 聲明的最小聲明區(qū)域中已經(jīng)聲明了和名稱空間中相同的名稱時(shí),若仍使用 using 聲明導(dǎo)入該名稱空間的同名名稱,則這兩個(gè)名稱將會(huì)發(fā)生沖突,編譯器會(huì)報(bào)錯(cuò)。與 using 聲明不同的是,using 編譯指令會(huì)進(jìn)行名稱解析,在一些時(shí)候名稱空間的變量會(huì)被同區(qū)域聲明的同名變量隱藏,不會(huì)出現(xiàn)名稱沖突的報(bào)錯(cuò)。但在另一些情況下,使用 using 編譯指令仍會(huì)出現(xiàn)名稱沖突的報(bào)錯(cuò),下面對此進(jìn)行總結(jié),測試所用的環(huán)境為 Microsoft Visual Studio 2019 以及 QT 5.9.2 MinGW 32bit。

1 using 編譯指令與同名全局變量

結(jié)論:若僅存在同名全局變量,不存在同名局部變量,使用 using 編譯指令后,在作用域的重合區(qū)域使用變量時(shí)一定會(huì)引發(fā)名稱沖突。除非在同名全局變量聲明前的代碼塊中使用,但這時(shí)是因?yàn)橥兞康淖饔糜虿恢睾?,而?using 編譯指令名稱解析的功勞。

1.1 在同名全局變量聲明前使用

若在同名全局變量聲明前的代碼塊中使用,由于作用域不重合,一定不會(huì)引發(fā)名稱沖突,因此只需測試在同名全局變量聲明前的全局區(qū)中使用 using 編譯指令的效果。測試程序如下:(出現(xiàn)名稱沖突報(bào)錯(cuò))

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//在同名全局變量聲明前使用
using namespace Jack;
 
//在全局名稱空間中定義變量
double pail = 2;
 
//測試
int main()
{
    using namespace std;
    
    //使用
    cout << pail << endl;
    cout << ::pail << endl;
    cout << Jack::pail << endl;
    
    return 0;
}

運(yùn)行結(jié)果如下:

1.2 在同名全局變量聲明后的全局區(qū)中使用

測試程序如下:(出現(xiàn)名稱沖突報(bào)錯(cuò))

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//在全局名稱空間中定義變量
double pail = 2;
 
//在同名全局變量聲明后使用
using namespace Jack;
 
//測試
int main()
{
    using namespace std;
    
    //使用
    cout << pail << endl;
    cout << ::pail << endl;
    cout << Jack::pail << endl;
    
    return 0;
}

運(yùn)行結(jié)果如下:

1.3 在同名全局變量聲明后的代碼塊中使用

測試程序如下:(出現(xiàn)名稱沖突報(bào)錯(cuò))

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//同名全局變量聲明
double pail = 2;
 
//測試
int main()
{
    using namespace std;
   
    //使用
    using namespace Jack;
    cout << pail << endl;
    cout << ::pail << endl;
    cout << Jack::pail << endl;
    
    return 0;
}

運(yùn)行結(jié)果如下:

2 using 編譯指令與同名局部變量

結(jié)論:若僅存在同名局部變量,不存在同名全局變量,使用 using 編譯指令將會(huì)進(jìn)行名稱解析,不會(huì)引發(fā)名稱沖突,但在代碼塊中,同名局部變量將隱藏名稱空間中的變量。

2.1 在同名局部變量聲明前的全局區(qū)中使用

測試程序如下:(運(yùn)行成功)

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//在同名局部變量聲明前的全局區(qū)中使用
using namespace Jack;
 
//測試
int main()
{
    using namespace std;
    
    //同名局部變量
    double pail = 2;
    
    //使用
    cout << pail << endl;       //結(jié)果為2
    cout << ::pail << endl;     //結(jié)果為1
    cout << Jack::pail << endl; //結(jié)果為1
    
    return 0;
}

運(yùn)行結(jié)果如下:

2.2 在同名局部變量聲明前的代碼塊中使用

測試程序如下:(運(yùn)行成功)

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//測試
int main()
{
    using namespace std;
    
    //在同名局部變量聲明前的代碼塊中使用
    using namespace Jack;
    
    //同名局部變量
    double pail = 2;
    
    //使用
    cout << pail << endl;       //結(jié)果為2
    cout << Jack::pail << endl; //結(jié)果為1
    
    return 0;
}

運(yùn)行結(jié)果如下:

2.3 在同名局部變量聲明后使用

若在同名局部變量聲明后的全局區(qū)中使用,由于作用域不重合,一定不會(huì)引發(fā)名稱沖突,因此只需測試在同名局部變量聲明后的代碼塊中使用 using 編譯指令的效果。測試程序如下:(運(yùn)行成功)

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//測試
int main()
{
    using namespace std;
    
    //同名局部變量
    double pail = 2;
    
    //在同名局部變量聲明后的代碼塊中使用
    using namespace Jack;
    
    //使用
    cout << pail << endl;       //結(jié)果為2
    cout << Jack::pail << endl; //結(jié)果為1
    
    return 0;
}

運(yùn)行結(jié)果如下:

3 不同名稱空間中的同名變量

結(jié)論:若不同名稱空間中存在同名變量,不存在同名全局變量以及同名局部變量,使用 using 編譯指令后,在作用域的重合區(qū)域使用變量時(shí)一定會(huì)引發(fā)名稱沖突。

3.1 using 編譯指令位置都在全局區(qū)中

測試程序如下:(出現(xiàn)名稱沖突報(bào)錯(cuò))

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
namespace Rose {
    double pail = 2;
}
 
//都在全局區(qū)中
using namespace Jack;
using namespace Rose;
 
//測試
int main()
{
    using namespace std;
    
    //使用
    cout << pail << endl;
    
    return 0;
}

運(yùn)行結(jié)果如下:

3.2 using 編譯指令位置都在代碼塊中

測試程序如下:(出現(xiàn)名稱沖突報(bào)錯(cuò))

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
namespace Rose {
    double pail = 2;
}
 
//測試
int main()
{
    using namespace std;
    
    //都在代碼塊中
    using namespace Jack;
    using namespace Rose;
    
    //使用
    cout << pail << endl;
    
    return 0;
}

運(yùn)行結(jié)果如下:

3.3 using 編譯指令位置不同區(qū)

測試程序如下:(出現(xiàn)名稱沖突報(bào)錯(cuò))

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
namespace Rose {
    double pail = 2;
}
 
//Jack位于全局區(qū)中
using namespace Jack;
 
//測試
int main()
{
    using namespace std;
    
    //Rose位于代碼塊中
    using namespace Rose;
    
    //使用
    cout << pail << endl;
    
    return 0;
}

運(yùn)行結(jié)果如下:

4 多個(gè)同名變量共存

結(jié)論:若名稱空間中的變量、同名全局變量、同名局部局部變量三者同時(shí)存在,using 編譯指令的使用位置不會(huì)影響名稱解析的結(jié)果,且不會(huì)引發(fā)名稱沖突,這正是 using 編譯指令進(jìn)行名稱解析的效果。

4.1 在同名全局變量聲明前的全局區(qū)中使用

測試程序如下:(運(yùn)行成功)

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//在同名全局變量聲明前的全局區(qū)中使用
using namespace Jack;
 
//同名全局變量
double pail = 2;
 
//測試
int main()
{
    using namespace std;
    
    //同名局部變量
    double pail = 3;
    
    //使用
    cout << pail << endl;       //結(jié)果為3
    cout << ::pail << endl;     //結(jié)果為2
    cout << Jack::pail << endl; //結(jié)果為1
    
    return 0;
}

運(yùn)行結(jié)果如下:

4.2 在同名全局變量聲明后的全局區(qū)中使用

測試程序如下:(運(yùn)行成功)

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//同名全局變量
double pail = 2;
 
//在同名全局變量聲明后的全局區(qū)中使用
using namespace Jack;
 
//測試
int main()
{
    using namespace std;
    
    //同名局部變量
    double pail = 3;
    
    //使用
    cout << pail << endl;       //結(jié)果為3
    cout << ::pail << endl;     //結(jié)果為2
    cout << Jack::pail << endl; //結(jié)果為1
    
    return 0;
}

運(yùn)行結(jié)果如下:

4.3 在同名局部變量聲明前的代碼塊中使用

測試程序如下:(運(yùn)行成功)

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//同名全局變量
double pail = 2;
 
//測試
int main()
{
    using namespace std;
    
    //在同名局部變量聲明前的代碼塊中使用
    using namespace Jack;
    
    //同名局部變量
    double pail = 3;
    
    //使用
    cout << pail << endl;       //結(jié)果為3
    cout << ::pail << endl;     //結(jié)果為2
    cout << Jack::pail << endl; //結(jié)果為1
    
    return 0;
}

運(yùn)行結(jié)果如下:

4.4 在同名局部變量聲明后的代碼塊中使用

測試程序如下:(運(yùn)行成功)

#include <iostream>
 
//自定義名稱空間
namespace Jack {
    double pail = 1;
}
 
//同名全局變量
double pail = 2;
 
//測試
int main()
{
    using namespace std;
    
    //同名局部變量
    double pail = 3;
    
    //在同名局部變量聲明后的代碼塊中使用
    using namespace Jack;
    
    //使用
    cout << pail << endl;       //結(jié)果為3
    cout << ::pail << endl;     //結(jié)果為2
    cout << Jack::pail << endl; //結(jié)果為1
    
    return 0;
}

運(yùn)行結(jié)果如下:

5 總結(jié)

通過上述多個(gè)測試,可以得到以下結(jié)論:

  • 若僅存在同名全局變量,不存在同名局部變量,使用 using 編譯指令后,在作用域的重合區(qū)域使用變量時(shí)一定會(huì)引發(fā)名稱沖突。
  • 若僅存在同名局部變量,不存在同名全局變量,使用 using 編譯指令將會(huì)進(jìn)行名稱解析,不會(huì)引發(fā)名稱沖突,但在代碼塊中,同名局部變量將隱藏名稱空間中的變量。
  • 若不同名稱空間中存在同名變量,不存在同名全局變量以及同名局部變量,使用 using 編譯指令后,在作用域的重合區(qū)域使用變量時(shí)一定會(huì)引發(fā)名稱沖突。
  • 若名稱空間中的變量、同名全局變量、同名局部局部變量三者同時(shí)存在,using 編譯指令的使用位置不會(huì)影響名稱解析的結(jié)果,且不會(huì)引發(fā)名稱沖突,這正是 using 編譯指令進(jìn)行名稱解析的效果。

Jack 名稱空間中的 pail 變量為例,將使用 using 編譯指令時(shí)可能遇到的各種情況列表如下,表中的最后一列是指在作用域的重合區(qū)域使用變量時(shí)是否會(huì)引發(fā)名稱沖突。

到此這篇關(guān)于C++ using 編譯指令與名稱沖突的文章就介紹到這了,更多相關(guān)C++ using 編譯指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

場景同名全局變量 pail同名局部變量pail另一名稱空間 Rose 的同名變量 pailusing 編譯指令是否名稱沖突
1存在沖突
2存在存在沖突
3存在不沖突
4存在存在不沖突
5存在沖突
6存在存在不沖突
7存在存在存在不沖突
8不沖突

到此這篇關(guān)于C++ using 編譯指令與名稱沖突問題的文章就介紹到這了,更多相關(guān)C++ using 編譯指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

五峰| 屏东市| 尼木县| 明溪县| 邵阳市| 高尔夫| 巴林左旗| 类乌齐县| 巨鹿县| 永兴县| 湘阴县| 双峰县| 平果县| 金塔县| 游戏| 长子县| 平陆县| 搜索| 拉萨市| 什邡市| 唐河县| 普宁市| 麟游县| 察隅县| 丹巴县| 乐陵市| 临沭县| 怀安县| 普宁市| 同江市| 天等县| 遂溪县| 乐陵市| 佛坪县| 绥中县| 贵定县| 霍林郭勒市| 北碚区| 疏勒县| 璧山县| 房产|