Unterschied im Aufruf von "MyFunction() und "::MyFunction()"
-
Ich bin jetzt schon des öfteren auf diese 2 Doppelpunte vor Funktionsaufrufen gestoßen, hab davon aber noch nie etwas gehört.
Ich meine jetzt nicht den Aufruf von Funktionen von Elternklassen wie z.B.CDialog::OnOk(); // <-- nicht sowasUnd der Aufruf von Funktionen anderer namespaces wie z.B. das hier:
using namespace std; int var; namespace myspace { int var = 5; } main() { var = 1; int i = var + myspace::var; // <-- nicht sowas }Nein, plötzlich taucht sowas hier auf. Oft in Verbindung mit Theads (Zusammenhang??).
Schnipsel:
struct CMyPara { HWND hwnd; } main() { //[...] AfxBeginThread(Funktionxyz, (void*)&m_Para, THREAD_PRIORITY_NORMAL); //[...] } UINT __cdecl Funktionxyz(LPVOID pPara) { CMyPara pMyPara = (FEReadTagsThreadPara*)pPara; ::PostMessage(pMyPara->hwnd, WM_ERROR, 12345, 0); // <---- sondern sowas }Oder das hier hab ich auch gefunden:
CWinThread* pThread = AfxBeginThread(Funktionxyz, this, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED); ::DuplicateHandle(GetCurrentProcess(), pThread->m_hThread, GetCurrentProcess(), &hThread, 0, FALSE, DUPLICATE_SAME_ACCESS); // <---- sondern sowas pThread->ResumeThread();Wo ist der Unterschied zum normalen Funktionsaufruf?
Und wenn es doch etwas mit namespaces zu tun hat, was macht es für einen Sinn eine Funktion im eigenen namespace aufzurufen? (Wo denn sonst?)Lasst mich nicht dumm sterben,
Danke.
-
Die Doppelpunkte dienen zur Auflösung von Namensräumen, das hast du schon richtig erkannt. Und wenn du keinen Namen davor angibst, beziehst du dich auf den globalen Namensraum. Damit kannst du die globalen Funktionen von ihren Methoden-Entsprechungen unterscheiden.
Z.B. ruftPostMessage(...)die Methode der CWnd-Klasse auf und::PostMessage(...)die gleichnamige Funktion der WinAPI.
-
Ah ok. Danke. Ich hab mich nämlich auch gewundert warum es egal ist, wenn ich die Doppelpunkte entferne. Die Message landet wohl bei CWnd::PostMessage() als auch bei der WinAPI PostMessage() an der gleichen Stelle.
-
Der Unterschied ist in diesem Beispiel wohl der, wie du das Ziel festlegst. CWnd::PostMessage() gibt die Nachricht an das Fenster, das mit this verbunden ist, weiter (welches das ist, hängt davon ab, wo du dich befindest). ::PostMessage() bekommt als ersten Parameter ein Window-Handle und schickt die Nachricht an dieses Fenster.
(Aber wenn du dich in einer Klasse bewegst, die nicht von CWnd abgeleitet ist (bzw. ein eigenes PostMessage() hat), sind tatsächlich beide Angaben identisch)