acabo intentado:
#define APOS '
#define CHAR2(a,b,c) a##b##c
#define CHAR1(a,b,c) CHAR2(a,b,c)
#define CHAR(x) CHAR1(APOS,x,APOS)
Lamentablemente, sin embargo, el preprocesador se queja de un sin terminar personaje.(Y de varios caracteres si tiene más de un carácter) una forma de errores sólo desactivar preprocesador: (no hay ninguna opción específica de advertencia para este)
-no-integrated-cpp -Xpreprocessor -w
Algunos ejemplos de optimización en tiempo de compilación con algunos otros trucos:
#define id1_id HELP
#define id2_id OKAY
#define LIST(item,...) \
item(id1, ##__VA_ARGS__)\
item(id2, ##__VA_ARGS__)\
item(id1, ##__VA_ARGS__)\
#define CODE(id,id2,...) ((CHAR(id##_id) == CHAR(id2##_id)) ? 1 : 0) +
int main() { printf("%d\n", LIST(CODE,id1) 0); return 0; }
Esto devuelve "2", ya que hay dos elementos que tienen id1.
Oh, ese segundo método es puro mal ;-) – Joey
'$' no es un carácter válido para un identificador, de acuerdo con el estándar C. Puede ser aceptado por algunos compiladores específicos, supongo. –
@Dale: Sí, GCC admite '$' como identificador. http://gcc.gnu.org/onlinedocs/gcc/Dollar-Signs.html#Dollar-Signs – kennytm