2015-07-21 25 views
8

Farklı ad alanlarına sahip, ad alanı ve turuncu ad alanı gibi farklı ad alanlarına sahip olduğumu varsayalım, ancak ad alanlarının her ikisi de myfunction() adında bir işlev içeriyor.Farklı ad alanlarındaki aynı işlev adı

Ana işlevde() işlevini çağırdığımda ne olur?

+7

Büyük olasılıkla ad bulunamadı ve kod derlenmiyor. Ama belki de bazı örnek kodları yayınla, çünkü detaylar önemlidir. – juanchopanza

+0

İşlev çağrısını, niyetlediğiniz ad alanıyla (örn. Apply :: myfunction() veya orange :: myfunction() – acraig5075

cevap

22

Bu, tam olarak hangi ad alanlarının tanıtıldığıdır. Gelen

senin main() veya genel ad yılında, sen çağrılacak olan wich myfunctions seçmek mümkün olacak genel olarak:

int main() 
{ 
    apple::myfunction(); // call the version into the apple namespace 
    orange::myfunction(); // call the orange one 
    myfunction(); // error: there is no using declaration/directive 
} 

direktifi (using namespace apple) kullanılarak durumunda ya Bir bildirgesini kullanarak (using apple::myfunction), ana hattın son satırı apple ad alanı içindeki sürümü çağırırdı. myfunction'un her iki sürümü de kapsamdaysa, son satır bir hata üretir, çünkü bu durumda hangi işlevin çağrılması gerektiğini belirtmeniz gerekir.

+0

ve "namespace apple' kullan" ve "namespace orange'u kullanarak" gibi bir şey kullanırsanız nitelendirin. Bu tam cevap için son şey sanırım. – Timo

+0

@Timo bu durumda çağrı belirsizdir ve derleyici bunu reddetmelidir. –

+0

, yani derleyici hatası mı? – Timo

5

Aşağıdaki örneği göz önünde bulundurun. fonksiyon ilan edildiği ad gereğince

namespace Gandalf{ 

    namespace Frodo{ 
     bool static hasMyPrecious(){ // _ZN7Gandalf5FrodoL13hasMyPreciousEv 
      return true; 
     } 
    }; 

    bool static hasMyPrecious(){ // _ZN7GandalfL13hasMyPreciousEv 
     return true; 
    } 
}; 

namespace Sauron{ 
    bool static hasMyPrecious(){ // _ZN5SauronL13hasMyPreciousEv 
     return true; 
    } 
}; 

bool hasMyPrecious(){ // _Z13hasMyPreciousv 
    return true; 
} 

int main() 
{ 
    if(Gandalf::Frodo::hasMyPrecious() || // _ZN7Gandalf5FrodoL13hasMyPreciousEv 
     Gandalf::hasMyPrecious()  || // _ZN7GandalfL13hasMyPreciousEv 
     Sauron::hasMyPrecious()   || // _ZN5SauronL13hasMyPreciousEv 
     hasMyPrecious()) // _Z13hasMyPreciousv 
     return 0; 

    return 1; 
} 

, derleyici fonksiyonu tanımlı olduğu ad kapsamı kodlama, işlev adı, dönüş türü ve gerçek parametrelerin başka bir şey değildir Mangled Adı denilen her fonksiyonun benzersiz bir kimlik üretir . Yorumlara bakınız. Bu işlevlere çağrı oluştururken, her işlev çağrısı, Derleyici raporları hatası bulunmadıysa aynı karmaşık imzaya bakar.

Dahili çalışma ile ilgileniyorsanız clang -emit-llvm -S -c main.cpp-o main.ll ile deneme yapmayı deneyin.

+2

Lütfen standartın herhangi bir isim tadilat stili belirtmediğini, hatta söyleyebildiğim kadarıyla bile bahsetmediğini unutmayın. Örnekleriniz G ++ için doğru, ancak MSVC bunu farklı yapıyor ve Intel'in bunu başka bir şekilde yaptığını düşünürdüm.Örneklerle örnek vermek güzeldir, ancak bu örnekler taşınabilir veya standart olmadığında, bu davranışa dayanamayacağınız açık olmalıdır, çünkü bu uygulama tanımlıdır. – Elkvis

+0

evet. @Elkvis işaret ettiğin için teşekkürler. Bu Kapsam Belirleme çalışması tanımlanmıştır ve derleyiciye göre değişir. Örnek, kapsam ve Kapsam kapsamındaki işlevin birbiriyle nasıl bağlantılı olduğunu göstermektir. ** NameLookUp ** değişiklikleri için kesinlikle algoritma, basit tablo tabanlı olabilir! ama sonunda aynı ada sahip gibi görünen fonksiyonlara bakıyoruz. ve bu kavramları clang ile son ipucu ile öğrenmek kolaydır :) –

+1

Tamamen OT, ama "Soron" diye bağırmak "Sauron"? –

İlgili konular