2015-05-27 21 views
9

Bu C++ dosya ... Bu simgelerin bulunduğu bir nesne dosyasınaAd alanı yönergesini kullanırken neden bir ad alanı eklenmiş?

namespace foo { 
    class C { 
     void m(); 
    }; 
    void f(); 
} 

using namespace foo; 

void C::m() {} 
void f() {} 

..Compiles:

$ g++ foo.cpp -c 
$ nm foo.o -C 
000000000000000a T f() 
0000000000000000 T foo::C::m() 

Neden ad f() de başa ama olsun C::m()? geliyor?

(Ben using namespace foo yerine namespace foo {...} kullanın, sonra her iki adın da foo önplanaları var).

+0

Yanıtın size gösterdiği gibi, soru yazarken sonuçlara atlamak için kızarma olmayın. Şaşırtıcı bir şey varsa, en iyi görünen çelişkiye nasıl yaklaştığınıza ve "Bağlantı farklı mı?" Bunun varlığını varsaymaktan ziyade (aslında bağlantınızın sizin durumunuzla ilgisi yoktur, tüm ilgili bağlantılar dışsaldır). –

+1

@KerrekSB Nedeni hakkında varsayımlarda bulunmamak için başlığı güncelledim. (C++ ile uğraşırken çoğu zaman bağlantı, kapsam ve depolama ayırmalarını karıştırıyorum). –

+0

Çok beğeni! –

cevap

12

void C::m() {}'da, C::m, nitelikli bir addır ve böyle bir tanım her zaman önceden bildirilmiş olan bir şeyi ifade eder. Derleyici C görüntüleniyor, aslında foo::C olduğunu bulur, kullanma yönergesi ve foo::C::m() tanımı olarak void C::m(){} alır.

void f() {} yazdığınızda, bu niteliksiz bir addır ve her zaman geçerli ad alanında, genel ad alanı olan işlevi bildirir.