2012-06-19 16 views
6

Trabajando con un marco de prueba de unidad, me encontré con una situación en la que me gustaría probar los argumentos de macro. Dicho simplemente, me gustaría expandir la macro FOO(x) de modo que FOO(int) sería short y FOO(anything_else) sería long.¿Puedo reemplazar condicionalmente los argumentos del preprocesador?

Con plantillas C++, por supuesto, esto no es un problema. Pero aquí necesito un reemplazo de token real, no solo un typedef. Es decir. FOO(char) FOO(char) i; debe ser una definición válida igual a long long i;.

+1

El último estándar C tiene una función donde el texto de reemplazo de una macro puede depender del tipo de expresión del primer argumento. Puedes usar esto como un bloque de construcción. –

+0

¿Has echado un vistazo a boost.pp y si puedes hackear algo junto con él? – PlasmaHH

+1

@StefanMajewsky: ¿Te estás refiriendo a Genéricos, creo? – dirkgently

Respuesta

0

lo que estás tratando de hacer es imposible.

Las macros son evaluadas por el preprocesador c, que como su nombre indica, se ejecuta antes de que se ejecute el compilador. Todavía no sabe cuáles son los tipos de sus símbolos.

¿Por qué no crear una clase para el tipo que se arroja a la derecha en el momento en que es evaluado por el compilador?

+0

No me importan los tipos. Sé que 'int' en la etapa de preprocesamiento es solo un token. Aún así, quiero actuar condicionalmente en el token 'int'. – MSalters

3

Hasta donde yo sé, las únicas operaciones de cuerda disponibles en las macros C son las de pegar/concatenar tokens (usando ##) y encerrarlas (usando #).

Estoy bastante seguro lo más cerca que vas a conseguir implica la enumeración de las posibilidades de este modo:

#define FOO(x) FOO__##x 
#define FOO__int short 
#define FOO__short long 
#define FOO__long long 
#define FOO__char long 
// ... for each type you want to replace 

Inspiración de this question.

+0

(Editar # 2): si tiene un conjunto limitado y conocido de "elses", podría enumerarlos a todos. – flolo

+0

Sí, me di cuenta de eso hace un momento, y limpié toda la publicación. – vergenzt

+0

No creo que pueda enumerar mis argumentos por adelantado; Podría obtener un 'FOO (AcmeWidgetUnitTest17)' :( – MSalters

Cuestiones relacionadas