Inkompatibilitäten gcc und MSVC



  • Hallo,
    also nur mal zur Beruhigung der allgemeinen Panik: Unser 15.000 Zeilen Uni-Projekt habe ich zu 73 % mit dem VC 6.0 entwickelt. Obwohl unsere Requirements einen gcc > 3.0 forderten. Das Ergebnis wurde dann hauptsächlich unter Linux (gcc 2.95 bis 3.3.2) übersetzt und betrieben.

    Die Hauptprobleme die ich hatte:
    1. No newline at end of file
    2. Ein Paar Probleme mit der STL
    3. Ein Paar Probleme mit der const-correctness.

    Insgesamt nie mehr als 8 1/2 Minuten Extraarbeit pro Build.

    Natürlich verwendet das Projekt kein "Template-Meta-Programming Alexandrescu-like" oder magische Compiler-Erweiterungen.
    Nur (miese) OOP in simplen C++ mit portablen Bibliotheken.

    Naja, installier einfach den gcc 😃



  • No newline at end of file

    Das kenne ich nur zu gut.



  • Vielleicht kann man jemand ein Tool prokken, das die Newlines einfügt, wenn sie noch nicht exisitieren. 🤡 🤡



  • Vielleicht kann man jemand ein Tool prokken, das die Newlines einfügt, wenn sie noch nicht exisitieren

    Wäre das nicht etwas mit Kanonen auf Spatzen geschossen?
    Als absoulter Anti-Shell-Kenner konnte ich innerhalb von 42 Minuten unter Linux folgendes zusammen zimmern:

    for file in *.cpp *.h ;
    do
            if [ `tail -c1 $file | tr -dc "\012" | wc -c` -ne 1 ] ; then
                    echo >> $file;
            fi
    done
    

    In C++ war ich zwar schneller, dafür ist das ganze viel länger und ähnlich flexibel wie eine Kruppstahlstange.

    #include <fstream>
    #include <iostream>
    #include <cassert>
    using namespace std;
    
    // Fügt der Datei mit dem Name fileName ein Newline-Zeichen an, falls
    // bisher kein solches Zeichen am Dateiende existiert.
    // Pre: 
    //	Datei mit Namen fileName existiert und kann zum Lesen und Schreiben
    //	geöffnet werden.
    // Post:
    //	Letztes Zeichen in der Datei ist ein Newline-Zeichen. 
    // return:
    //	0 : Aktion erfolgreich
    //	-1: Fehler: Open
    //	-2: Fehler: Lesen
    //	-3: Fehler:	Schreiben
    // Das Verhalten ist undefiniert für fileName == 0
    int appendNewLineIfMissing(const char* fileName);
    
    int main(int argc, char** argv)
    {
    	if (argc < 2)
    	{
    		cout << "usage: addNL fileName1 [fileName2...]" << endl;
    		return -4;
    	}
    	int result = 0;
    	for (int i = 1; i < argc; ++i)
    	{
    		if (int tmpResult = appendNewLineIfMissing(argv[i]))
    		{
    			cerr << "Error: ";
    			switch(tmpResult)
    			{
    			case -1:
    				cerr << "Could not open file: " << argv[i];
    				break;
    			case -2:
    				cerr << "Could not read from file: " << argv[i];
    				break;
    			case -3: 
    				cerr << "Could not write to file: " << argv[i];
    				break;
    			default: assert(false);
    			}
    			cerr << endl;
    			result = tmpResult;
    		}
    	}
    	return result;
    }
    
    int appendNewLineIfMissing(const char* fileName)
    {
    	assert(fileName);
    	enum {ERROR_OPEN = -1, ERROR_READ = -2, ERROR_WRITE = -3, SUCCESS = 0};
    
    	fstream file(fileName, ios::in|ios::out);
    	if (!file)
    		return ERROR_OPEN;
    	file.seekg(-1, ios::end);
    	char lastChar = 0;
    	if (!file.get(lastChar))
    		return ERROR_READ;
    
    	if (lastChar != '\n')
    	{
    		if (!file.seekp(0, ios::end) || !file.put('\n'))
    			return ERROR_WRITE;
    	}
    	return SUCCESS;
    }
    

    Das Programm funktioniert natürlich nur ordentlich, wenn die Shell sowas wie *.cpp automatisch ersetzt. Ansonsten müsste man hier noch expliziten Verzeichnis-Durchlauf-Code ergänzen.



  • Oder einfach

    echo >> *.cpp *.h

    Ist ja nicht so schlimm, wenn eine Zeile zu viel drin ist 🙂



  • Shade of Mine
    zum thema welcher compiler mehr standard untersützt und welcher nicht:
    http://boost.sourceforge.net/regression-logs/

    VC2003 ist uebrigens momentan am dichtesten am ISO-Standard dran. gcc, CodeWarrior und sogar Comeau muessen sich geschlagen geben.

    VC++7.1 100%
    GCC 99%

    😉



  • Patrick schrieb:

    zum thema welcher compiler mehr standard untersützt und welcher nicht:
    http://boost.sourceforge.net/regression-logs/

    Ich nehme mal an, dass es für MS wichtig war boost kompilieren zu können - schliesslich haben sie ja damit geworben.

    beim DMC++ hätte es teilweise gewaltige sprünge in der standard kompatibilität in den boost-regression-tests gegeben - weil einfach ein bug gefixt wurde, der in boost fehler erzeugt hatte. So springt die conformance dann zB von 70 auf 90% ohne die standard kompatibilität wesentlich zu verbessern.

    ich denke, dass alle compiler die in den 90ern bei boost sind, etwa gleich gut sind. Comeau, Intel 8, gcc und VC++7.1 sind aber ATM die besten compiler am markt 🙂



  • Hume: Deine Lösung sieht mir ehrlich gesagt fast ein bisschen umständlich aus; ich hätte eher sowas ähnliches wie das da geschrieben:

    sed -i '$s/^\(.\+\)$/\1\n/' dateiname.cpp
    

    Ginge uU auch schöner aber ich bin mit sed nicht so auf Du und Du. 😉



  • Die Hauptprobleme die ich hatte:
    1. No newline at end of file
    2. Ein Paar Probleme mit der STL

    Wobei das eher kein Problem mit dem compiler an sich sein sollte, sondern mit der mitgelieferten STL und der iostream lib.

    Schon mal STLPort probiert ? ich habs sowohl auf windoof (VC 6.0) und Linux (gcc) am laufen, allein schon um ne gemeinsame Basis zu haben ...

    Ciao ...



  • GregorX schrieb:

    Hallo, ich muss im Studium meine C++-Aufgaben mit dem gcc kompilieren.

    [neugier]was studierst du denn so[/neugier]


Anmelden zum Antworten