Esto es lo que estoy pensando.
#define prefix_1 1 #define prefix_2 2 #define prefix_3 3 Y quiero definir una macro usando los prefijos anteriores, como macro macro_prefix_1 macro_prefix_2 , y espero que se conviertan en macro_1 macro_2 , etc. Al igual que el código a continuación
#define macro_##prefix_1 I_am_macro_1 #define macro_##prefix_2 I_am_macro_2es posible?
Desafortunadamente, lo que estás tratando de hacer es imposible. La directiva (##) es imposible de usar dentro de una declaración de macro. Sólo es posible utilizarlo dentro de la definición como tal.
#define glue(a,b) a ## b glue(c,out) << "test";Ejemplo tomado de cplusplus.com
A continuación, he escrito un ejemplo de lo que quieres hacer.
#include <stdio.h> #define prefix_1 1 #define prefix_2 2 #define prefix_3 3 #define macro_##prefix_1 "macro_1" #define macro_##prefix_2 "macro_2" #define macro_##prefix_3 "macro_3" int main(){ printf("%s\n%s\n%s\n", macro_prefix_1, macro_prefix_2, macro_prefix_3); return 0; }Cuando intente compilar el código anterior, obtendrá este registro de compilación.
||=== Build: Debug in file_test (compiler: GNU GCC Compiler) ===| main.cpp|7|warning: missing whitespace after the macro name [enabled by default]| main.cpp|7|error: '##' cannot appear at either end of a macro expansion| main.cpp|8|warning: missing whitespace after the macro name [enabled by default]| main.cpp|8|error: '##' cannot appear at either end of a macro expansion| main.cpp|9|warning: missing whitespace after the macro name [enabled by default]| main.cpp|9|error: '##' cannot appear at either end of a macro expansion| main.cpp||In function 'int main()':| main.cpp|13|error: 'macro_prefix_1' was not declared in this scope| main.cpp|13|error: 'macro_prefix_2' was not declared in this scope| main.cpp|13|error: 'macro_prefix_3' was not declared in this scope| ||=== Build failed: 6 error(s), 3 warning(s) (0 minute(s), 0 second(s)) ===|Entonces, si desea poder tener macros, solo tendrá que agregar el prefijo normalmente. Afortunadamente, básicamente ya estabas haciendo esto, pero agregando "##". Espero que esto haya ayudado.