2017-11-13 1 views
3

Wie definiere ich einen Anruf so über C-Präprozessor Anweisungen zu snprintf?Neudefinieren einer Funktion mit einer Vorlage

sprintf_s<sizeof(dataFile)>(dataFile, arg2, arg3); 

Ich habe versucht, diese (was nicht funktioniert):

#define sprintf_s<sizeof(x)>(args...) snprintf<sizeof(x)>(args) 

Vor allem, weil ich brauche dies bereits für Anrufe sprintf_s ohne Vorlage in den gleichen Dateien:

#define sprintf_s(args...) snprintf(args) 
+0

Was ist 'dataFile' und was macht 'sizeof (dataFile)'? –

+0

Es ist nicht ganz klar, was genau Sie wollen, aber vielleicht einfach '#define sprintf_s snprintf' sollte helfen. –

Antwort

2

Wie mkrs said in his/her answer, der Präprozessor ermöglicht nicht, Vorlagen-ähnliche Funktionsaufrufe zu entsprechen.

Sie brauchen nicht den Präprozessor für diese Aufgabe - verwenden, um eine variadische Vorlage statt:

template <int Size, typename... Ts> 
auto sprintf_s(Ts&&... xs) 
{ 
    return snprintf<Size>(std::forward<Ts>(xs)...); 
} 

Wenn snprintfva_arg verwendet, müssen Sie eine andere Art von Wrapper:

template <int Size> 
void sprintf_s(char* s, ...) 
{ 
    va_list args; 
    va_start(args, s); 
    snprintf(args); 
    va_end(args); 
} 

Weitere Beispiele finden Sie unter How to wrap a function with variable length arguments?.

+0

Dies gibt mir leider den folgenden Compiler Fehler: Vergleich der verschiedenen Zeigertypen ('int (*) (char * __ beschränken, size_t, const char * __ restri, .. .) throw() '(aka' int (*) (char * __ beschränken, unsigned lang, const char * __ beschränken, ...) throw() ') und ' int * ') muss ich zugeben dass ich nur mit Templates angefangen habe und sie von Zeit zu Zeit immer noch verwirrend finde. –

+0

@EXIT_FAILURE: Ah, es verwendet 'va_args'. Siehe https://stackoverflow.com/questions/41400/how-to-wrap-a-function-with-variable-length-arguments –

3

Dies wird vom Präprozessor einfach nicht unterstützt. Der Präprozessor ist weitgehend derselbe wie der C-Präprozessor und C hat keine Vorstellung von Templates.

+0

OP fragt nach dem C-Präprozessor, der (hoffentlich) derselbe ist wie der C-Präprozessor ... – user463035818

+0

Er ist auch als C++ markiert. Das Aufrufen des C-Präprozessors für C++ - Code ist noch weniger sinnvoll. – mrks

+0

Hast du eine Idee, wie ich das auf die entsprechende Linux-Funktion umleiten könnte, ohne den eigentlichen Code neu zu schreiben? –

Verwandte Themen