stdarg.h va_start <-- wieso warning ?



  • Hi !
    Ich hab mich gerade mal mit funktionen mit n belibigen parametern beschäftigt...

    Hier mal ein funktionierendes beispiel:

    #include <iostream>
    using namespace std;
    #include <stdarg.h>
    
    void varParams(int cnt, ... )
    {
    	va_list params; 
    	int intpar;    
    	va_start(params, cnt); 
    
    	for (int i=0; i<cnt; i++)
    	{
    		  intpar = va_arg(params, int);
    		  cout << intpar << endl;      
    	}
    	cout << "---" << endl;
    	va_end(params);
    }
    
    int main()
    {
    	varParams(2, 5, 2);
    	return 0;
    }
    

    Mein Problem ist jetzt, wenn ich den parameter cnt in der funktion initialisiere,bekomme ich folgende warnung:

    Warnung: Zweiter Parameter von »va_start« ist nicht letztgenanntes Argument [standardmäßig aktiviert]
    

    Beispiel:

    #include <iostream>
    using namespace std;
    #include <stdarg.h>
    
    void varParams(int cnt, ... )
    {
    	va_list params; 
    	int intpar;    
    
    	int cnt2 = 2; 
    
    	va_start(params, cnt2); 
    
    	for (int i=0; i<cnt2; i++)
    	{
    		  intpar = va_arg(params, int);
    		  cout << intpar << endl;      
    	}
    	cout << "---" << endl;
    	va_end(params);
    }
    
    int main()
    {
    	varParams(2, 5, 2);
    	return 0;
    }
    

    Meine frage ist:
    a) was bedeutet dieses warning genau ?
    b) wie kann ich es ausschalten / umgehen ?

    Mfg Benny



  • Lies nochmal die Doku zu dem va_start, dann sollte das klarer werden. Es kommt nämlich nicht auf den Wert des zweiten Parameters sondern auf seine Adresse an.



  • The parameter parmN is the identifier of the last fixed parameter in the variable parameter list in the function definition (the one just before the ', ...'). <--- Hmm... wie macht printf das ?

    so : ???

    void printf (const char * format, ...)
    {
    	va_list args;
    	va_start (args, format);
    	while(*format != 0)
        {
          if(*format++=='%')[bla..]
        }
    	va_end (args);
    }
    

    also ist nen beispiel was ich gefunden hab... das gleiche hatte ich quasie auch vor nur dachte ich ich müsste erst zählen wie viele parameter übergeben wurden...

    Mfg Benny



  • ok, perfekt !

    also ich hab vorher schon in die referenz geguckt, aber scheinbar zu schluderig...

    Danke für die hilfe !!!


Anmelden zum Antworten