2011-07-12 10 views
37

Tengo un encabezado C que se escribió para compilar como C y C++ (solo usa las características del subconjunto común, y usa esa cosa extern "C").¿Es una buena idea incluir un #include en un bloque de espacio de nombres?

El problema es que ese encabezado declara cosas en el espacio de nombres global. Prefiero evitar eso por las razones habituales. Pensé en hacer esto:

namespace foo { 
#include <foo.h> 
} 

¿Está haciendo esto una buena idea? ¿Tengo alternativas que no incluyen editar el archivo de encabezado?

+2

Idea interesante. Sin embargo, si es un código C, lo dejaría donde está: espacio de nombres global. –

Respuesta

42

No, es ’ s una mala idea. Con las declaraciones de C++, es probable que se introduzcan errores de vinculador a medida que los identificadores se declaran en el espacio de nombres incorrecto. Con las declaraciones de C, funciona, pero puede ocultar conflictos entre identificadores en el espacio de nombre global (que intentabas evitar, supongo) hasta el momento del enlace; no es realmente poner los identificadores en un espacio de nombres.

Una mejor idea sería poner sus propios identificadores en un espacio de nombres y evitar definir nada más que main en el global.

+0

+1 En realidad me encontré con un problema como este porque un determinado proyecto de código abierto decidió hacer [exactamente esto] (http://stackoverflow.com/questions/6006602/pulling-cc-standard-library-into-your-project -namespace-buena-idea). El resultado fue que tuve que buscar entre *** numerosos proyectos *** y encabezados estándar para descubrir la causa raíz. Me las arreglé para resolverlo, pero al final esto acaba siendo otro problema de portabilidad del que preocuparse. – greatwolf

+0

Tenía la sensación de que esto no era del todo correcto, pero no podía decir por qué. Me alegro de haber decidido preguntar aquí :) –

+1

Felicitaciones por la placa de oro :) –

5

Hice este tipo de "colocarlo en un espacio de nombres" para <windows.h> a finales de los 90.

Aunque no con soporte completo: se basa en el principio de agregar soporte para lo que sea que necesite cuando lo necesite.

La clave para hacer ese trabajo fue verificar qué encabezados de biblioteca C se incluyeron, y asegúrese de incluirlos primero. Se redujo a 4 de estos encabezados, IIRC. Sin embargo, el amor de Microsoft por las macros dificultó las cosas.

Así que se puede hacer en la práctica para encabezados C (o C++ restringido al subconjunto tipo C), pero al costo de actualizar su envoltorio para cada nueva versión del wrappee, lo cual es poco práctico y/o muy costoso. Por no mencionar laborioso.

En conclusión, no, no es una buena idea. :-)

Hablando desde la experiencia.

Cuestiones relacionadas