consideran este programa:
line#
1 #include <string>
2
3 using namespace std;
4
5 struct string { const char* p; }; // Beware: another string!
6
7 int main()
8 {
9 string x; // Error: ambiguous - which string is wanted?
10 }
Si intenta compilar, verá errores:
g++ using.cc -o using
using.cc: In function `int main()':
using.cc:9: error: use of `string' is ambiguous
using.cc:5: error: first declared as `struct string' here
/usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stringfwd.h:60: error:
also declared as `typedef struct std::basic_string<char, std::char_traits<char>, std::allocator<char> > std::string' here
using.cc:9: error: `string' was not declared in this scope
using.cc:9: error: expected `;' before "x"
El problema aquí es que cuando main()
especifica string x;
, el compilador no está seguro de si se requiere el ::string
definido por el usuario o std::string
incluido.
Ahora imagina que toma la parte superior del programa ... las líneas 1 a 5 - hasta e incluyendo el struct string
... y ponerlo en un archivo de cabecera que luego #include
antes main()
. Nada cambia: todavía tienes un error. Por lo tanto, al igual que para los programas independientes, los archivos de encabezado con declaraciones using
en ellos pueden causar problemas para otros códigos que los incluyen, lo que hace que algunas de sus declaraciones sean ambiguas.
Puede ser un dolor más grande, ya que los encabezados se pueden incluir, directa o indirectamente, arbitrariamente grandes cantidades de código dependiente, y ...
- retirar la declaración
using
de la cabecera, o
- un cambio en el contenido de
<string>
, o cualquier otro encabezado que afecta std::
... podría romper el código incluyendo la cabecera problemática. Cualquiera de los dos problemas puede hacer que el código dependiente no se pueda compilar, y es posible que los problemas no se noten hasta que se intente otra compilación. Además, la persona que sufre debido a la declaración using
puede no tener permisos de sistema de archivos/repositorio de código, autoridad corporativa, etc. para eliminar la declaración using
del encabezado, ni corregir otro código de cliente afectado.
Dicho esto, si un encabezado solo tiene "uso" dentro de una clase o función, entonces no hay efecto en el código más allá de ese alcance, por lo que el impacto potencial de los cambios en std :: se reduce drásticamente.
Yeap, aquí tienes: http://stackoverflow.com/questions/2152925/can-i-undo-the-effect-of-using-namespace-in-c – sharptooth
@sharptooth: "Let me Stackoverflow eso para ti "apareció en mi cabeza :) – Mehrdad
@Mehrdad: LOL, espero que nunca lleguemos a esa etapa. – sharptooth