Diciamo che ho due file:Namespace e membri della classe statici che collega
/**
* class.cpp
*/
#include <stdio.h>
class foo
{
private:
int func();
};
int foo::func(void)
{
printf("[%s:%d]: %s\n", __FILE__, __LINE__, __FUNCTION__);
return -1;
}
e
/**
* main.cpp
*/
#include <stdio.h>
namespace foo
{
int func(void);
}
int main(void)
{
int ret = foo::func();
printf("[%s:%d]: ret=%d\n", __FILE__, __LINE__, ret);
return 0;
}
compilato come segue:
g++ -o a.out main.cpp class.cpp
C'è un output di file eseguibile:
[class.cpp:15]: func
[main.cpp:14]: ret=-1
E infine la mia domanda:
Perché questo codice di esempio compilato senza errori e siamo in grado di richiamare privata metodo classe foo?
Compilato con gcc 4.6.3 ma non solo. So che il compilatore non distingue questi due simboli (func funzione dal namespace foo e funzione privata foo da classe foo). Uscita da nm:
nm class.o
00000000 T _ZN3foo4funcEv
00000017 r _ZZN3foo4funcEvE12__FUNCTION__
U printf
nm main.o
U _ZN3foo4funcEv
00000000 T main
U printf
Vorrei chiedere se questo comportamento è corretto o no? IMHO questo non è un comportamento corretto e non è affatto sicuro (interrompe l'incapsulamento).
Vorrei ricordare che il compilatore di Visual Studio 2008 non collega questi due simboli.
Ok, ho capito tutto ma la domanda è: PERCHÉ esiste un comportamento del compilatore gcc. Il compilatore di Windows è in grado di distinguere questi simboli. Namespace e classe non sono la stessa cosa, sono io wright? Il compilatore dovrebbe conoscere tutta la differenza tra uno spazio dei nomi e una classe, non dovrebbe? – pako
Il compilatore lo sa, ma il linker no. Tuttavia, il compilatore converte ciascun file in un file oggetto separato. Il modo in cui hai definito i due file è che sono completamente separati dal compilatore. Quello che VS fa è buono, ma non è richiesto che sia fatto. Quindi, non è fatto da gcc. Clang compila anche questo senza lamentarsi a proposito. – meyumer
So che il compilatore sa, ma quello che voglio dire è che il compilatore genera totalmente gli stessi simboli per quelle funzioni, anche se sono totalmente differenti. Quindi forse gcc dovrebbe fare lo stesso del compilatore VS? Potrebbe evitare alcuni potenziali errori. – pako