2011-12-30 14 views
9

He visto esto algunas veces, y me he estado rascando la cabeza preguntándome por qué ...¿Por qué se usa :: (scope) con el operando vacío de la mano izquierda?

Como un ejemplo: (http://www.codeguru.com/forum/showthread.php? t = 377394)

void LeftClick () 
{ 
    INPUT Input={0}; 
    // left down 
    Input.type  = INPUT_MOUSE; 
    Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN; 
    ::SendInput(1,&Input,sizeof(INPUT)); 

    // left up 
    ::ZeroMemory(&Input,sizeof(INPUT)); 
    Input.type  = INPUT_MOUSE; 
    Input.mi.dwFlags = MOUSEEVENTF_LEFTUP; 
    ::SendInput(1,&Input,sizeof(INPUT)); 
} 

Este ejemplo funciona sin los operadores :: (scope) entonces ¿por qué están incluso allí?

+0

También funciona si '// down' izquierda es remoto. Entonces, ¿por qué está allí? Para mayor claridad. – tenfour

+0

@tenfour No es realmente ... –

+0

Suponiendo que OP es correcto, "funciona" incluso sin el '::', entonces sí, realmente. Pero entiendo que hay más, y es por eso que no publiqué como respuesta. – tenfour

Respuesta

22

Esto significa básicamente "obtener la función de ámbito GLOBAL, en lugar de la función actualmente visible".

void SendInput() { /* (1) */ 
} 

namespace derp { 
    void SendInput() { /* (2) */ 
    } 

    void LeftClick() { 
     ... 
     ::SendInput(); /* matches (1) */ 
     SendInput(); /* matches (2) */ 
    } 
} 
+3

En este caso (significa global). Significa en realidad utilizar una "Ruta de espacio de nombres absoluta" y no una "Ruta de espacio de nombres relativa". Simplemente es una ruta corta en este contexto y, por lo tanto, en el espacio de nombres global. –

+0

@LokiAstari ¿Podría explicar la diferencia? ¿Es básicamente lo mismo que hacer referencia a un archivo como '/ path/to/file.txt' en lugar de' ./path/to/file.txt' - uno es relativo a la posición actual, el otro es relativo a un lugar específico? (en este caso, la carpeta raíz) –

+0

@QPaysTaxes: Un buen análogo. Pero también necesita aplicar la variable PATH para mejorar el análogo. Se buscará una ruta relativa en cada directorio en la ruta (mientras que una ruta absoluta no lo hará). En el caso de C++, la RUTA está representada por cada ámbito anidado desde la posición actual. Consulte https://gist.github.com/Loki-Astari/bddbdc98e8c8b9da5edc Esto hace que las rutas reactivas sean susceptibles de agregar código nuevo en un espacio de nombres principal. –

1

Es forzar que el símbolo se busque en el alcance global.

void foo() {} // 1 

namespace A 
{ 
    void foo() {} // 2 

    void bar() 
    { 
     foo(); // 2 
     ::foo(); // 1 
    } 
} 
3

Digamos que tiene lo siguiente:

void bar() 
{ 
} 

struct Foo 
{ 
    void bar(); 
}; 

Si desea llamar a la función global bar de la función miembro Foo::bar utiliza la sintaxis con vacío a mano izquierda:

void Foo::bar() 
{ 
    // Call the global bar function, not recursively call myself 
    ::bar(); 
} 
0

El :: se utiliza para dar acceso a un objeto directamente desde fuera del objeto.

2

Fuerza una resolución absoluta del nombre.
Sin él, se busca la resolución del nombre relativo a la ruta del espacio de nombres de clase/funciones.

Así asumir LeftClick() está en la jerarquía del espacio de nombres:

namespace Level1 
{ 
    namespace Level2 
    { 
     namespace Level3 
     { 
      LeftClick() 
      { 
       ::SendInput(); // Absolute path only. SendInput in global namespace 
       SendInput();  // Relative path (Note resolved at compile time) 
            // 
            // Looks for the function here (in this order) 
            // ::Level1::Level2::Level3::SendInput() 
            // ::Level1::Level2::SendInput() 
            // ::Level1::SendInput() 
            // ::SendInput() 
      } 
     } 
    } 
} 

se vuelve más interesante si usted tiene un nombre anidado:

namespace Level1 
{ 
    namespace Level2 
    { 
     namespace Level3 
     { 
      LeftClick() 
      { 
       ::Test::Action(); // Absolute Path: Function Action() 
            //    in namespace Test 
            //    in global namespace 

       Test::Action(); // Relative Path: Function Action() 
            //    in namespace Test 
            //    in current namespace path. 
            // 
        // It will Look for Test (in this order) 
        // ::Level1::Level2::Level3::Test 
        // ::Level1::Level2::Test 
        // ::Level1::Test 
        // ::Test 
        // 
        // In the first Test (and only the first) it finds it will 
        // try and resolve the Action() function. If it is not there 
        // it is a compile time error. 
      } 
     } 
    } 
} 
Cuestiones relacionadas