C in Visual Studio .... wie?



  • Hallo Leute,

    ich musste arbeitsechnisch auf Windows umsteigen und möche gerne in Visual Studio C Programme kompilieren. Wie stell ich das an? Es gibt da nur Visual C++ Projekte...

    Viele Grüße !

    🙂



  • C++ enthaelt eine grosse Teilmenge von C. Wo gibt es denn Probleme?



  • Einfach die Datei main.c statt main.cpp nennen und schon behandelt der compiler es als C.



  • In den Projekteinstellungen kannst du auch auswählen, ob C oder C++ kompiliert werden soll. Aber wie schon gesagt, die Datei(en) einfach mit Endung ".c" benennen, dann geht's automatisch.



  • Hallo, erstmal vielen Dank!

    ok - so habe ich es versucht. Mich wundert, dass der compiler stdbool.h nicht kennt. Scheint also keinen C99 standard zu haben ... Was kann man da machen?



  • Kleinling schrieb:

    Hallo, erstmal vielen Dank!

    ok - so habe ich es versucht. Mich wundert, dass der compiler stdbool.h nicht kennt. Scheint also keinen C99 standard zu haben ...

    Wohl nicht.
    http://en.wikipedia.org/wiki/C99

    Kleinling schrieb:

    Was kann man da machen?

    Naja, wenn's nur um stdbool.h geht, das kannste ja gut selber nachbauen.
    Aber die anderen Features alle?

    Der Vorschlag von knivil, C++ zu nehmen und sich auf die C-Features zu beschränken, ist gar nicht total unvernünftig. VLAs haste dann aber trotzdem nicht.


  • Mod

    knivil schrieb:

    C++ enthaelt eine grosse Teilmenge von C. Wo gibt es denn Probleme?

    Aber sobald du Pointerkonvertierungen drin hast (d.h. unter anderem jedes Programm mit manueller Speicherverwaltung und jedwede Art von generischem Code) geht es schon nicht mehr. Das hat man eigentlich in jedem normalem Programm drin. Dann muss man überall Casts rein machen.

    Kleinling schrieb:

    Scheint also keinen C99 standard zu haben

    So ist es.

    Was kann man da machen?

    Nun, in diesem konkretem Fall geht zur Not noch

    #define bool int
    #define true 1
    #define false 0
    

    Ansonsten: Musste eben C89 programmieren.

    P.S.: Vorsicht: Bei obigem Beispiel gehen manche Sachen nicht (oder sind gefährlich), die mit einem richtigen bool gehen würden, wie zum Beispiel ein absoluter Vergleich mit true (ist sowieso schlechter Stil, sollte man aber erwähnt haben).



  • man kann auch definieren

    #define true (!false)
    


  • oder so

    typedef unsigned int bool;
      const bool false = (0 != 0);
      const bool true  = (0 == 0);
    


  • ...



  • "1" ist immer sehr schlecht... 0 verstehe ich ja noch... aber mal macht jemand 1, mal jemand -1....
    Vergleiche sollten immer nur auf "false" erfolgen 😉 Eigentlich gehört "true" in if-Abfragen verboten... nur bei Zuweisungen sollte man sie verwenden...



  • ...


  • Mod

    Swordfish schrieb:

    Nur zur Klarstellung: Ich bezog mich auf dd++s Vorschlag.

    Das gesagt gilt aber genau so für den Vorschlag von "einer der es wirklich kan"(sic!).
    (!false) == (!0) == (1) == 1



  • die Sprache C ist weiter verbreitet als C++, da gibt es auch exotische Hardware mit exotischen Compilern. deshalb steht in einigen Headern diese TRUE = (0==0) und FALSE = (0!=0) oder FALSE = (!TRUE) Berechnung. wenn man einen Compiler hat, der mindestens C89 konform ist, kann man auch 1 und 0 verwenden


  • Mod

    dd++ schrieb:

    die Sprache C ist weiter verbreitet als C++, da gibt es auch exotische Hardware mit exotischen Compilern. deshalb steht in einigen Headern diese TRUE = (0==0) und FALSE = (0!=0) oder FALSE = (!TRUE) Berechnung.

    Jetzt bin ich aber mal gespannt auf ein Beispiel dafür.



  • [quote="SeppJ"]

    Kleinling schrieb:

    Scheint also keinen C99 standard zu haben

    So ist es.

    Was kann man da machen?

    Nun, in diesem konkretem Fall geht zur Not noch

    #define bool int
    #define true 1
    #define false 0
    

    Ansonsten: Musste eben C89 programmieren.
    [QUOTE]

    Es ist guter Programmierstil und Konvention, wenn man Makros groß schreibt.
    Du schreibst sie dagegen klein, das ist schlecht.

    P.S.: Vorsicht: Bei obigem Beispiel gehen manche Sachen nicht (oder sind gefährlich), die mit einem richtigen bool gehen würden, wie zum Beispiel ein absoluter Vergleich mit true (ist sowieso schlechter Stil, sollte man aber erwähnt haben).

    Wieso?
    Meinst du das:

    bool b = 0;
    if (b == true){
    ...
    }

    weil man auch einfach

    book b = 0;
    if (b){
    ...
    }

    schreiben könnte?



  • @TS

    Wieso verwendet du nicht einfach den gcc in Visual Studio, der kann C99.



  • Große Makros schrieb:

    Wieso verwendet du nicht einfach den gcc in Visual Studio, der kann C99.

    Hast du auch einen einfachen Vorschlag, wie man das am besten macht!?



  • dot schrieb:

    Große Makros schrieb:

    Wieso verwendet du nicht einfach den gcc in Visual Studio, der kann C99.

    Hast du auch einen einfachen Vorschlag, wie man das am besten macht!?

    http://social.msdn.microsoft.com/Forums/en-US/Vsexpressvc/thread/c07f416a-3d1d-46d0-95cf-81fe790c461f

    Wem das zu kompliziert ist, der soll einfach Eclipse IDE for C/C++ Developers nehmen.
    http://www.eclipse.org/downloads/


  • Mod

    Große Markos schrieb:

    Es ist guter Programmierstil und Konvention, wenn man Makros groß schreibt.
    Du schreibst sie dagegen klein, das ist schlecht.

    Nein, das ist der Ersatz für stdbool.h. Das war gefragt, dies ist die Lösung. Da sind sie klein geschrieben.

    P.S.: Vorsicht: Bei obigem Beispiel gehen manche Sachen nicht (oder sind gefährlich), die mit einem richtigen bool gehen würden, wie zum Beispiel ein absoluter Vergleich mit true (ist sowieso schlechter Stil, sollte man aber erwähnt haben).

    Wieso?
    Meinst du das:

    bool b = 0;
    if (b == true){
    ...
    }

    weil man auch einfach

    book b = 0;
    if (b){
    ...
    }

    schreiben könnte?

    if (irgendwas == true) ist bei obiger Definiton nicht äquivalent zu (irgendwas != false) , sondern zu if (irgendwas == 1) . Konkret ist in richtigem C++/C99:

    bool foo = 2;
    if (foo == true) // wahr
    

    aber mit obigem stdbool-Ersatz:

    bool foo = 2;
    if (foo == true) // falsch
    

    😮
    Das ist wohl selten das, was man meint.


Anmelden zum Antworten