Per favore aiutatemi a risolvere questo problema. Questo è un codice di esempio per ottenere il numero di riga, il nome del file e le variabili in C. Quando ho tentato di eseguirlo, ho ricevuto alcuni errori. Sono sicuro che ci sono molti modi per farlo. Ma devo usare il codice esistente per ottenere alcune funzionalità. Qualsiasi aiuto o suggerimento sarebbe molto apprezzato.Macro all'interno della macro in C
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#define MY_MACRO1(fmt, args...) \
{ \
char buf_d[1024]; \
MY_MACRO2(__FILE__, __LINE__,call_func(buf_d,sizeof(buf_d),fmt,##args)); \
}
#define MY_MACRO2(__FILE__, __LINE__,fmt, ...) printf("%s : %d -> %s : \n",__FILE__, __LINE__, __VA_ARGS__);
char * call_func(char *buf_t, size_t size, const char *fmt, ...)
{
va_list ap;
va_start(ap,fmt);
vsnprintf(buf_t, size, fmt, ap);
va_end(ap);
return buf_t;
}
int main()
{
printf("\n Now I am printintg macro....\n");
MY_MACRO1("Macro is working fine..\n");
return 0;
}
uscita:
Si prega di trovare la macro di espansione. L'ultimo argomento nella macro (func return value) manca.
char buf_d[1024];
printf("%s : %d -> %s : \n","file.c",35,);;
Errore: generato
file.c:35:83: error: expected expression
{ char buf_d[1024]; printf("%s : %d -> %s : \n","file.c", 35,);; };
^
1 errore.
Elefante: Perché utilizzare una macro? – user4581301
Perché eseguire il doppio tag di questo C e C++ quando non è né l'uno né l'altro? Stai usando un'estensione compilatore non standard di un compilatore che non hai specificato nella domanda. Deve diventare valido C? Deve diventare C++ valido? Deve diventare accettabile per il tuo particolare compilatore? Tutti e tre ti darebbero risposte diverse. E perché mai scegliere di ridefinire '__FILE__' e' __LINE__' come parametri macro ?! – hvd
IIRC 'fmt, args ...' seguito in seguito da un ', ## args' è un'estensione non portatile. Puoi usare '...' al posto di 'fmt, args ...' e '__VA_ARGS__' al posto di' fmt, ## args' – technosaurus