¿Cómo hacer que la macro tenga una matriz como #define a_macro {5,7,7,97}?

Por favor, pasar.

#define _VERSION_ 1.4 #define DEFAULT_NETWORK_TOKEN_KEY { 3, 6, 5, 100} 

// No puedo cambiar las macros anteriores pero abajo

 #define STR_VALUE(arg) #arg #define FUNCTION_NAME(name) STR_VALUE(name\r) #define TEST_FUNC #AP started v _VERSION_ #define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC) #define QUOTE_X(t)#t #define QUOTE(t)QUOTE_X(t) #define ABC 100 //{ 3, 6, 5, 100} #define MYSTR "The value of ABC is" const uint8 startMsg[] = MYSTR " " QUOTE(ABC); 

Resultados: El valor de ABC es 100.

 const uint8 startMsg[] = TEST_FUNC_NAME; 

resultados: #AP inició v 1.4 (retorno de carro) // También quiero eliminar el espacio entre v y 1.4

quiero

 const uint8 startMsg[] = ?? ; 

En caso de que #AP inició [3.6.5.100] v1.4 (Retorno de carro) o #AP comience [3.6.5.100] v1.4 (Retorno de carro) o similar.

Estoy trabajando en un chip SOC y necesito mostrar esto en el inicio. Urgente. 🙂

—— La respuesta a la pregunta es ——

 #define NETTOKENKEY(a,b,c,d) "[" #a "." #b "." #c "." #d "]" #define GENNETTOKENKEY(z) NETTOKENKEY(z) #define STRINGIZER(arg) #arg #define STR_VALUE(arg) STRINGIZER(arg) #define AP_VERSION_STR "#AP started v" STR_VALUE(_VERSION_) #define AP_NETVERSION_STR "#AP started " \ GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \ " v" STR_VALUE(_VERSION_) **"\r"** const uint8 startMsg[] = AP_NETVERSION_STR ; 

El preprocesador C es un progtwig de sustitución de texto bastante simple, y no creo que pueda hacer lo que necesitas y producir cadenas constantes de tiempo de comstackción si es absolutamente imposible cambiar la macro DEFAULT_NETWORK_TOKEN_KEY .

Transformar la notación ‘matriz’ es particularmente difícil: de hecho, la condición previa para no cambiar la macro que define la matriz probablemente signifique que es imposible.

Si es posible definir nuevas macros y redefinir DEFAULT_NETWORK_TOKEN_KEY para que produzca el mismo valor que siempre, entonces puede obtener el resultado que desea.

Para ilustrar, tenga en cuenta que puede escribir:

 #define x { 3, 45, 5, 49} #define f4(a,b,c,d) #a " - " #b ":" #c "/" #d #define y(z) f4(z) y(x) 

Cuando se pre-procesa, eso produce:

 "{ 3" " - " "45" ":" "5" "/" "49}" 

Tenga en cuenta que las llaves son parte de las cadenas de argumento. Ahora, si puedes hacer:

 #define DEFAULT_NETWORK_TOKEN_KEY_VALUES 3, 6, 5, 100 #define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_VALUES} 

(donde estoy conservando tu espacio asimétrico, aunque no creo que sea realmente necesario), entonces puedes usar:

 #define NETTOKENKEY(a,b,c,d) "[" #a "." #b "." #c "." #d "]" #define GENNETTOKENKEY(z) NETTOKENKEY(z) GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) 

para obtener la cadena “[3.6.5.100]” (para los valores en mi ejemplo).

Deshacerse del espacio entre la v y la 1.4 es relativamente fácil:

 #define STRINGIZER(arg) #arg #define STR_VALUE(arg) STRINGIZER(arg) #define AP_VERSION_STR "#AP started v" STR_VALUE(_VERSION_) AP_VERSION_STR 

Uniendo estos rendimientos juntos:

 #define AP_NETVERSION_STR "#AP started " \ GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \ " v" STR_VALUE(_VERSION_) static const char version[] = AP_NETVERSION_STR; 

Si desea una '\r' al final, agregue "\r" al final de la definición de macro AP_NETVERSION_STR. La concatenación de cuerdas es muy útil!

Pero, esto se basa en ser capaz de “cambiar” la definición de DEFAULT_NETWORK_TOKEN_KEY para que pueda ser formateada de esta manera. Sin ese cambio, no creo que puedas hacerlo.


¡Las pruebas son necesarias!

 #define _VERSION_ 1.4 #define DEFAULT_NETWORK_TOKEN_KEY_VALUES 3, 6, 5, 100 #define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_VALUES} #define NETTOKENKEY(a,b,c,d) "[" #a "." #b "." #c "." #d "]" #define GENNETTOKENKEY(z) NETTOKENKEY(z) GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) #define STRINGIZER(arg) #arg #define STR_VALUE(arg) STRINGIZER(arg) #define AP_VERSION_STR "#AP started v" STR_VALUE(_VERSION_) AP_VERSION_STR #define AP_NETVERSION_STR "#AP started " \ GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \ " v" STR_VALUE(_VERSION_) AP_NETVERSION_STR 

Cuando se ejecuta a través de gcc -E , lo que necesitamos es la salida ligeramente desinfectada (líneas en blanco y controles #line eliminados):

 "[" "3" "." "6" "." "5" "." "100" "]" "#AP started v" "1.4" "#AP started " "[" "3" "." "6" "." "5" "." "100" "]" " v" "1.4" 

por qué usar macro si puedes:

 uint arr[] = DEFAULT_NETWORK_TOKEN_KEY; float v = VERSION; sprintf(buffer, "#AP started [%u.%u.%u.%u] v%f", arr[0], arr[1], arr[2], arr[3], v); 

Lea sobre el # y ## en el preprocesador C. Usted está poniendo un montón de envoltura alrededor de algo bastante fácil

http://gcc.gnu.org/onlinedocs/cpp/Stringification.html

Por cierto, AFAIK no podrá usar el preprocesador para convertir su {} en []

Será mejor que use una estructura de datos de preprocesador como lo proporciona Boost.Preprocessor . Todas las macros funcionan en estándar C89.