C++ erwartet Typ Bezeichner Fehler
Ich bin versucht, zu schreiben eine wrapper-Funktion, um herauszufinden, wer den Aufruf einer spezifischen Funktion. So .h-Datei habe ich noch folgende: (und die Umsetzung in den .cc-Datei)
extern int foo(/*some arguments*/);
extern void call_log(const char*file,const char*function,const int line,const char*args);
#define foo(...) (call_log(__FILE__, __FUNCTION__, __LINE__, "" #__VA_ARGS__), foo(__VA_ARGS__))
Jedoch bekomme ich die folgende Fehlermeldung:
error: expected a type specifier
(call_log(__FILE__, __FUNCTION__, __LINE__, "" #__VA_ARGS__),foo(__VA_ARGS__)
Davon ausgehen, dass die foo Funktion aufgerufen wird, werden einige Parameter und gibt einen int.
den compiler ist gcc 3.4
Dank
BEARBEITEN
entfernt. "" und extra Abstand, doch problem immer noch da. Kann jemand sehen, was es bewirken kann. Beachten Sie auch, dass ich mit variadic Makros-unterstützt durch mein compiler (c99)
Edit 2
Nur, um die Forderungen über meine illegale Verwendung von c/c++ - Konstrukte. Der folgende code unten funktioniert, und ich bin versucht, Sie anzupassen, um meine aktuelle (über Funktion)
#include <stdio.h>
int funcA( int a, int b ){ return a+b; }
//instrumentation
void call_log(const char*file,const char*function,const int line,const char*args){
printf("file:%s line: %i function: %s args: %s\n",file,line,function,args);
}
#define funcA(...) \
(call_log(__FILE__, __FUNCTION__, __LINE__, "" #__VA_ARGS__), funcA(__VA_ARGS__))
//testing
void funcB()
{
funcA(7,8);
}
int main(void){
int x = funcA(1,2)+
funcA(3,4);
printf( "x: %i (==10)\n", x );
funcA(5,6);
funcB();
}
Edit 3
Als litb wies darauf hin, das problem ist, in der Tat, aufgrund makro-Ersetzungen. Mir ist auch aufgefallen, dass die foo ist nicht nur eine Funktion aufrufen, aber auch als ptr->foo[] in einigen Fällen. Alle ides wie zu beheben diese Art von Fragen, ohne mehr code
Bitte zeigen Sie die Linie, wo Sie das makro. Vor allem vorhergehenden und folgenden...
Ich meine, das ist so real wie es nur geht, ich kopieren und einfügen aus meiner Quelle, und ersetzt mir die Funktion Namen foo.
Was ist der compiler? Hier habe ich vorausgesetzt, "c99" bezieht sich auf die standard-Sprache im Gegensatz zu einem compiler-Namen.
Die Erklärung der
funcA
können problematisch sein, weil es kann dazu führen, substitution durch das makro bereits, wenn es darum geht definiert zu werden, bevor. Sie können erklären, die Funktion wie folgt statt: int (funcA)( int a, int b ){ return a+b; }
InformationsquelleAutor vehomzzz | 2009-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der beste Weg, um herauszufinden, was falsch würde es sein, dass der compiler zeigen die vorprozessierten code. Sie können dann einfacher vor Ort das problem in die betreffende Zeile.
InformationsquelleAutor xtofl
Wenn ich mich nicht Irre, ich glaube, Sie haben eine Reihe von syntax-Fehlern in der definition und Erklärung von call_log.
In der definition, die ich bin ziemlich sicher, Sie brauchen einen Raum zwischen der const char* und die variable name. ie...
extern void call_log(const char* file,const char* Funktion,const int line,const char* args);
Darüber hinaus in der Erklärung, ich glaube nicht, können Sie append #__VA_ARGS__ "" in der Art und Weise, die Sie tun. Das makro wird dieses Problem gelöst:
(call_log(file_name, function_name, line_#, "" arg1, arg2...), foo(args[])
ist kein Gültiger Aufruf der Funktion. Auf der einen Seite-beachten Sie auch fehlt ein Semikolon nach der makro-definition.
Schließlich sehe ich nicht eine Referenz auf foo(args) in Ihrem makro-definition; Es ist möglich, fehlt mir etwas Kontext, aber möchten Sie vielleicht zu betrachten, dass als gut.
Hoffe, das hilft...
CJ
Ich zweite xtofl Antwort, fügen Sie den Befehl zum generieren der .ich Datei, zu der compiler-Befehlszeile, und suchen Sie dann nach call_log und pwlf_eval zu sehen, was tatsächlich erzeugt. BTW, ich verpasst, dass Sie generieren pwlf_eval in meiner ursprünglichen Antwort. Ich glaube, Sie brauchen, um zu erklären, call_log von selbst, bevor Sie Sie in ein anderes Gespräch führen. Es ist schon eine Weile her, seit ich arbeitete mit extern-Funktion-Definitionen, so dass ich könnte falsch sein über diese.
Sie können richtig sein, aber in meinen Jahren, die ich gesehen habe viel code, der kompiliert wird, aber nicht arbeiten :). Wie ich bereits erwähnte, ich habe nicht gearbeitet mit extern definierten Funktionen für eine Weile, so ist mein Rat Wert sein kann, was es kostet...
Der original-code nicht erklären call_log als argument an eine Funktion, wie dein Beispiel tut. Wie ich vorher schon erwähnte, könnte dies das Problem sein. pwlf_eval nicht über eine type-definition für call_log. Korrigieren Sie mich, wenn ich falsch bin, aber ist nicht die syntax für die Deklaration einer externen Funktion mehr wie: extern (void)(call_log(...)); ?
InformationsquelleAutor