Bitte helfen Sie mir, dieses Problem zu lösen. Dies ist ein Beispielcode, um Zeilennummer, Dateiname und Var-Argumente in C zu erhalten. Als ich das versuchte, habe ich einige Fehler bekommen. Ich bin mir sicher, dass es viele Möglichkeiten gibt, dies zu tun. Aber ich muss vorhandenen Code verwenden, um einige Funktionalität zu erreichen. Jede Hilfe oder Vorschläge wären sehr willkommen.Makro innerhalb von Makro 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;
}
Ausgang:
Bitte Makroerweiterung finden. Das letzte Argument im Makro (func return value) fehlt.
char buf_d[1024];
printf("%s : %d -> %s : \n","file.c",35,);;
Fehler:
file.c:35:83: error: expected expression
{ char buf_d[1024]; printf("%s : %d -> %s : \n","file.c", 35,);; };
^
1 Fehler erzeugt.
Elefant: Warum ein Makro verwenden? – user4581301
Warum Dual-Tag dieses C und C++, wenn es nicht ist? Sie verwenden eine nicht standardmäßige Compiler-Erweiterung eines Compilers, den Sie in der Frage nicht angegeben haben. Muss es gültig werden? Muss es gültiges C++ werden? Muss es für Ihren speziellen Compiler akzeptabel sein? Alle drei würden dir unterschiedliche Antworten geben. Und warum in aller Welt beschließen, "__FILE__" und "__LINE__" als Makroparameter neu zu definieren ?! – hvd
IIRC 'fmt, args ...' später gefolgt von einem ', ## args' ist eine nicht-portable Erweiterung. Sie können '...' anstelle von 'fmt, args ...' und '__VA_ARGS__' anstelle von' fmt, ## args' verwenden – technosaurus