Komische Funktionsdeklaration mit "..."



  • Hi,
    ich hoffe ich bin in diesem Forum richtig.
    Ich habe eine Klasse von Codeproject eingebunden mit der ich
    ein ListControl sortieren kann (http://www.codeproject.com/KB/list/sortlistctrl.aspx)

    Nun ist dort eine Funktion wie folgt vorhanden:

    int AddItem( LPCTSTR pszText,... );
    

    bzw.:

    int CSortListCtrl::AddItem( LPCTSTR pszText,... )
    {
    	const int iIndex = InsertItem( GetItemCount(), pszText );
    
    	LPTSTR* arrpsz = new LPTSTR[ m_iNumColumns ];
    	arrpsz[ 0 ] = new TCHAR[ lstrlen( pszText ) + 1 ];
    	(void)lstrcpy( arrpsz[ 0 ], pszText );
    
     	va_list list;
    	va_start( list, pszText );
    
    	for( int iColumn = 1; iColumn < m_iNumColumns; iColumn++ )
    	{
    		pszText = va_arg( list, LPCTSTR );
    		ASSERT_VALID_STRING( pszText );
    		VERIFY( CListCtrl::SetItem( iIndex, iColumn, LVIF_TEXT, pszText, 0, 0, 0, 0 ) );
    
    		arrpsz[ iColumn ] = new TCHAR[ lstrlen( pszText ) + 1 ];
    		(void)lstrcpy( arrpsz[ iColumn ], pszText );
    	}
    
    	va_end( list );
    
    	VERIFY( SetTextArray( iIndex, arrpsz ) );
    
    	return iIndex;
    }
    

    Mich würde interessieren, warum das durchkompiliert ohne Fehler anzuzeigen.
    Ich habe noch nie gesehen, dass irgendwo einfach drei Punkte angegeben wurden.
    Was ja wahrscheinlich bedeuten soll, dass man beliebig viele Parameter übergeben
    kann? Oder wie muss ich das verstehen 😕 (Ich nutze VS 2008 SP1)





  • die Punkte nennen sich Ellipse. Schau mal im Buch/Tutorial deiner Wahl nach variablen Argumenten oder va_args.
    Als Hinweis: die Dinger dürfen nur verwendet werden, wenn die zusätzlichen Parameter PODs sind. (Was das ist steht in der FAQ)



  • Hallo und viele Dank für diese Info.
    Das ist ja genial mit den variablen Argumenten...:-)

    Mich wundert nur, warum es an dieser Stelle bei einem anderen
    Rechner (Vista) Probleme in der Programmausführung gab. Das Programm
    ist genau an der Stelle wo diese Funktion gerufen wurde abgeschmiert.
    Beim Kompilieren gab es aber keinerlei Probleme.

    Leider bekomme ich das nicht mehr nachgestellt, da der Rechner
    auf dem das der Fall war inzwischen nicht mehr vorhanden ist und ich
    auch keinen anderen Vista Rechner zur Verfügung habe um es nochmals zu
    testen.

    Kann das überhaupt zu OS spezifischen Problemen durch die Verwendung
    von "va_" Funktionen kommen?



  • Elpi schrieb:

    Das ist ja genial mit den variablen Argumenten...:-)

    So toll ist das gar nicht. Die Typsicherheit geht Dir damit flöten. Du kannst auch wirklich nur PODs übergeben und nicht so etwas wie std::string zum Beispiel.

    Ich habe vor nicht allzu langer Zeit gelernt, dass der GCC bei einigen Aufrufen solcher Funktionen die Typen überprüfen kann. Das erste Argument muss dazu ein String-Literal im printf-Format sein. Natürlich kannst Du theoretisch auch ein eigenes Format benutzen, um Zahl und Art der folgenden Parameter zu kodieren. Kein Compiler kann dann aber sicherstellen, dass die Funktion "richtig" implementiert wurde und dass die Funktion "richtig" aufgerufen wird.

    Mein Punkt ist: Du brauchst das mit den "var args" eigentlich nicht lernen -- nur wissen, dass es das gibt. Ich habe noch nie das Bedürfnis gehabt, es zu benutzen. C++ bietet Mittel und Wege, um zB eine formatierte Ausgabe typsicher und erweiterbar zu machen, siehe Boost.Format.

    Gruß,
    SP


Anmelden zum Antworten