Variable Anzahl von Parametern

Hallo Leute,
Ich suche ein Makro, das mit die Anzahl der Parameter angibt.
Der folgende Code funktioniert nicht, das assert springt manchmal an,
obwohl alles ok ist.
Grüße Chris


char* PString::append(const char* str, … )
{
// TODO assert that occurencies of % match number of parameters
// TODO assert that type of parameters are valid (no PString but char*)

const int bufferSize = 1024;
char charBuffer[bufferSize];

va_list vlist;
va_start(vlist, str);

#ifdef DEBUG
int count_in_args = 0;
va_list args;
void* option = (void*)str;
va_start(args, str);
do
{
++count_in_args;
option = va_arg(args, void*);
}
while (option != 0 && option != " ");
va_end(args);
assert( count_in_string == count_in_args );
#endif

_vsnprintf( charBuffer, bufferSize-1, str, vlist );

cat( charBuffer );

return s;
}

Aufruf etwa mit PString().append("%f", 5.0f) oder („a%sc“, „b“)

Hallo Leute,
Ich suche ein Makro, das mit die Anzahl der Parameter angibt.
Der folgende Code funktioniert nicht, das assert springt
manchmal an,
obwohl alles ok ist.
Grüße Chris

Die Anzahl der Argumente findest du erstmal gar nicht raus,
weil die Info nirgends abgelegt wird. Um die Anzahl aber dennoch
(mehr oder weniger zuverlässig) rauszufinden, gibts es verschiedene
Möglichkeiten:
1. Du parsed den format string von deinem printf, der ist
 ausschlaggebend, wieviele Argument tatsächlich erwartet werden.
 (deswegen crashed printf() auch gerne mal, wenn der format string
 mehr Variablen enthält als Funktionsargumente vorhanden sind).
 Diese Methode sagt also nichts über die wirkliche Anzahl der
 Argument aus, sondern nur über die Anzahl der 'verwendeten'
 Argumente.
2. Üblicherweise übergibt man aber die Anzahl der Argument explizit
 oder implizit.
 Explizit als eigenes Argument, der die Anzahl enthält:
 void function(unsigned numArgs, ...);
 Usage: function(0);
 function(1, "etwas");
 function(2, "etwas", "mehr");
 Implizit mit einem besonderen Abschlussargument:
 void function(const char\* fmt, ...);
 Usage: function("some format string", "etwas", "text", NULL);

Hallo,

Verflixt. Das ist blöd. Leider brauche ich diese Funktion um z.B. bei einem Assert die aktuelle Programmzeile als String auszugeben. Und die kann das Programm vorher nicht wissen, sie kann ein %-Zeichen enthalten und dann crasht es.

Gruß Chris

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]