new struct element[10] kompiliert unter CB2007 nicht aber unter CB2010



  • Hallo

    Die Definition des structs darf nicht in einer Funktion stehen. Das ist von der Sprachdefinition C++ her verboten, und sollte von keinem Compiler akzeptiert werden.

    bis bald
    akari



  • Tja, in soapC.cpp ist die struct-Def. ausserhalb der Fkt.

    Folgender Code kompiliert auch nicht:

    //---------------------------------------------------------------------------
    #pragma hdrstop
    #include <tchar.h>
    //---------------------------------------------------------------------------
    struct element
    {
        int key;
    };
    
    #pragma argsused
    int _tmain(int argc, _TCHAR* argv[])
    {
    
        struct element* myList = new struct element[10];
    
        return 0;
    }
    //---------------------------------------------------------------------------
    

    ergibt: BCC32 Error: E2141 Declarationsyntax error

    Ich verzweifle.



  • Hmm, bei XE funktioniert es ohne Probleme:

    //---------------------------------------------------------------------------
    
    #pragma hdrstop
    
    #include <tchar.h>
    //---------------------------------------------------------------------------
    
    #pragma argsused
    struct element
    {
    	int key;
    };
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	struct element* myList = new struct element[10];
    	return 0;
    }
    //---------------------------------------------------------------------------
    

    Kannst ja auch mal so Probieren:

    element* myList = new element[10];
    


  • Hallo akari,

    sorry, daß ich dir mal ausnahmsweise widersprechen muß, aber lokale Struktur- und Klassendefinitionen (innerhalb von Funktionen) sind in C++ erlaubt.
    Einzig für die Instantiierung innerhalb von Template-Klassen, z.B. vector<>, wird eine globale Struktur- bzw. Klassendefinition verlangt (vllt. hast du dich deswegen vertan).
    s.a. C++ Die Programmiersprache: C13.8.3 Namensbindung bei Instanziierung



  • Eles schrieb:

    Hmm, bei XE funktioniert es ohne Probleme:

    [snip]

    Kannst ja auch mal so Probieren:

    element* myList = new element[10];
    

    So gehts, danke für den Hinweis. Müsste ja eigentlich das selbe, so wie ich den Code verstehe.

    Problem ist nun, dass alle meine generierten gSOAP-Files durchgehen muss und

    cp->ptr = (void*)SOAP_NEW(struct SOAP_ENV__Fault[n]);
    

    in

    cp->ptr = (void*)SOAP_NEW(SOAP_ENV__Fault[n]);
    

    ändern muss. Keine wilde Sache, aber nervig.

    Ich werde mal in einem Embarcadero-Forum - wenig Hoffnung auf Antwort - nachfragen, warum es mit 2010 nicht geht, mit 2007 und XE jedoch schon. Irgendetwas scheinen die da in 2010 verbockt zu haben.

    Danke einstweilen!



  • Mit 2010 hatte ich auch die meisten Probleme, immer wieder Kleinigkeiten die einfach nicht wollten. Hat Monate gedauert um den Chef zu überreden auf XE umzustellen.





  • Th69 schrieb:

    sorry, daß ich dir mal ausnahmsweise widersprechen muß, aber lokale Struktur- und Klassendefinitionen (innerhalb von Funktionen) sind in C++ erlaubt.
    Einzig für die Instantiierung innerhalb von Template-Klassen, z.B. vector<>, wird eine globale Struktur- bzw. Klassendefinition verlangt (vllt. hast du dich deswegen vertan).

    Da hast du Recht, das habe ich nicht bedacht. Ich würde in C++ nie auf die Idee kommen, eine Struktur/Klasse in einer Funktion zu definieren...
    Der eigentliche Fehlergrund mit dem struct in der Variablendeklaration ist damit auch geklärt. Die Syntax mit struct ist ein Überbleibsel aus C, und eigentlich in C++ nicht erlaubt. Sowohl in meinen Builder 5 als auch in meinem MinGW wird das struct noch akzeptiert. Offenbar wurde der Compiler des neuen Builder in diesem Fall auf reine C++ Konformität gebracht.

    bis bald
    akari



  • akari schrieb:

    Der eigentliche Fehlergrund mit dem struct in der Variablendeklaration ist damit auch geklärt. Die Syntax mit struct ist ein Überbleibsel aus C, und eigentlich in C++ nicht erlaubt. Sowohl in meinen Builder 5 als auch in meinem MinGW wird das struct noch akzeptiert. Offenbar wurde der Compiler des neuen Builder in diesem Fall auf reine C++ Konformität gebracht.

    Aha, dann müsste es evtl. irgendwo eine Option in BC2010 geben, um diese Prüfung abzuschalten. Die Frage ist dann aber auch noch, warum XE diese Prüfung nicht mehr macht und den aus C++ Sichtpunkt "falschen" Code akzeptiert.

    Dann ist wohl bei gSOAP noch etwas zu erledigen, falls dies kein korrekter C++ Code ist.



  • aekeller schrieb:

    Mal sehen:
    https://forums.embarcadero.com/thread.jspa?threadID=53041&tstart=0

    Folgendes ist herausgekommen:

    In C++, the true name of the type is 'element', not 'struct element' as
    it is in C. C++ is also supposed to cope with the C naming, but my guess
    is that they've introduced a bug into the compiler that they've not
    noticed because they've not run your style of code past it.

    An experienced C++ programmer is going to be too lazy to do all that
    unnecessary typing, especially as sooner or later that 'struct' mutates
    into 'class', and suddenly every place it's used would need updating!

    Ich werde versuchen, das Problem bei der Wurzel zu beheben und haben einen Bug bei gSOAP eröffnet:
    https://sourceforge.net/tracker/?func=detail&atid=468021&aid=3292955&group_id=52781

    Danke für alle Inputs und guter Wochenstart!


Anmelden zum Antworten