¿Es legal la siguiente según el estándar de C++? (Si la respuesta es diferente de la norma a norma, me gustaría saber que, también.)¿Definir un no-op de nivel superior en C++?
#define VERY_OLD_COMPILER 1
#ifdef VERY_OLD_COMPILER
#define USING_NAMESPACE_STD enum { }
#else
#define USING_NAMESPACE_STD using namespace std
#endif
USING_NAMESPACE_STD;
int main(int argc, char *argv[]) {
// etc.
El objetivo es definir una macro que pueda invocar en la línea de nivel superior y seguir con un punto y coma , tal que no tiene ningún efecto. Estoy bastante seguro de que los puntos y comas parciales en el nivel superior no están permitidos (GCC se queja de ellos, de todos modos), así que simplemente definir una macro vacía no funciona.
Declarar una estructura anónima vacía no funciona porque necesita un nombre, y no quiero contaminar el espacio de nombres.
¿Hace una declaración enum vacía vacía (enum { }
) hacer el truco? Funciona en todos los compiladores que he probado, pero, por supuesto, eso no es lo mismo que estar permitido por la especificación.
Cualquier otra idea/comentario de bienvenida. Bueno, cualquier cosa que no sea "descartar ese compilador". Créame, me encantaría.
¿Por qué debe seguir la macro llamada con un punto y coma? ¿No sería trivial resolver esto si no hicieras eso? –
@Greg: preferencia personal. Estoy acostumbrado a invocar macros como 'DO_STUFF (x, y);' dentro de una función, y sé cómo escribir un no-operativo como ese. Creo que 'USING_NAMESPACE_STD' es un buen nombre para esto, y creo que poner un punto y coma al final parece natural, así que eso es lo que quiero. Tengo curiosidad de saber si es posible en el idioma definido por la especificación. – Nemo
Estoy de acuerdo con preferir el punto y coma al final. Hay momentos en los que tiene que usar macros de declaración que no pueden seguirse con un punto y coma, pero si puede evitar eso, debería hacerlo. –