|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
C++ compilato con GCC (-lstdstdcc++)
Salva a tutti!
Come molti di voi sapranno è possibile compilare, ovviamente, un'applicazione C++ usando G++, ma anche più esoticamente, usando il caro vecchio GCC linkando una libreria alquanto interessante.. libstdc++ che contiene l'intero runtime C++ Mi chiedo questo mi permette di usare tutto il C++ in un programma che magari è abbastanza C liscio, ma magari voglio usare senza wrapper o menate una libreria C++? Fino a dove posso spingermi?
Cosa mi dite? Fino a quanto mi possa spingere? Lasciando da parte, per ora, che magari non è così elegante mischiare così 2 linguaggio vomre fosse antani per quanto stretti parenti... io vedo ad ora, vantaggi:
Ditemi, ditemi son curioso come un cavallo |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Non farti fregare dai nomi. Gcc non fa altro che chiamare g++ quando gli passi un file c++.
Semmai il problema si porrebbe se cerchi di compilare un file .c con g++. Il file verrebbe compilato come se fosse c++ e non c. Ovviamente essendo c++ un superset di c lo compila. La differenza è che però c++ ha alcune regole in più e altre differenti dal c, per cui vedresti warnings dove prima non li vedevi e altre cose del genere. Niente di terribile comunque, oltre al fatto che g++ compilerebbe il c linkando con libstdc++ |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Allora vediamo se riesco a spiegarmi un pochino meglio supponiamo che io ho questo programmino che risiede in un .c:
Codice:
int
main(void)
{
bubbu *a = new bubbu();
printf("This a C or C++ program?\n");
[...]
delete a;
return EXIT_SUCCES; /// = 0
}
Supponiamo ora che io volglia compilare questo .c ho tre possibilità:
E' più chiaro qual è il mio dubbio, ora? SO che (3) va perché l'abbiamo fatto; il programma gira bello sereno ed è in produzione da 2-3 anni (ci passate tutti i giorni se siete d'Incisa e usa il TelePass Lo so, lo so certe curiosità a volte è meglio tenersele... ora voi mi dite che NON potrebbe funzionare magar |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Bella domanda. Ho provato quel codice e il compilatore si lamenta fin dall'inizio, dicendo che new non esiste.
Io sto usando la versione 4.6.1, non so se le versioni precedenti si comportassero diversamente, però è impossibile che interpreti quel codice come C, altrimenti dovrebbe lamentarsi di new e delete. Quindi temo proprio che l'eseguibile è compilato tramite g++ |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Quote:
attualmente g++ e gcc sono due eseguibili distinti...in passato gcc richiamava g++ quando opportuno, oggi invece ho dovuto notare che non funge più in questo modo ricordo benissimo che 2-3 anni fa compilavo i sorgenti c++ con gcc, mentre oggi mi dice che non capisce cos'è new |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quote:
Il gcc liscio, ovviamente, sì non è in grado di compilarlo Al momento non ho VirtualBox installato, ma dovrebbe andare a naso Il Problema è mettendo che compili ottenga il binario e funzioi pure senza corare... che cosa è il mio software? Esso è:
Ce dite? |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Eppure, corregimi, se sbaglio l'assembler ottenuto da GCC e quello ottenuto da G++ è differente, giusto?
Uno ha tutto l'overhead del C++ (ctor, dtor ecc...) l'altro essendo C è quasi assembler di suo Lasciamo stare il compilato, dai... diciamo che dopo il linking non è più riconoscibile (in realtà se ce l'hai grosso, IMHO, lo vedi che è C++)... ma il mio file .c è codice scritto in c o in c++? SI fa, è bello, brutto, rischioso, pericoloso, ecc...? |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Per poter funzionare devi ovviamente possedere tutto il runtime del c++. Le classi altrimenti come le gestisci?
L'overhead del c++ c'è tutto, altrimenti non funzionerebbe. Quindi in sostanza nel tuo caso hai un vero e proprio programma c++. La cosa che mi ha un pò spaventato è che gcc riesce a riconoscere i costrutti del c++ senza problemi. In passato ricordo che funzionava perchè richiamava sottobanco g++, oggi invece ho dovuto notare che non è più così. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2007
Messaggi: 2516
|
Più banalmente, un vero compilatore c, con un commento // dovrebbe dare errore
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Mar 2007
Città: Milano Beach
Messaggi: 1696
|
Quote:
__________________
~ Cthulhu: MacBookPro 13.3" ~ Azathoth: D510MO |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Sapete che una volta Io fui ripreso per un semplice "//" ???
... non scherzo mica eh Purtroppo la mentalità di molti "Veri Programmatori"(tm) è molto, troppo legato al passato... per loro esiste solo il C (ed è già una cosa da ballerine... fosse per loro si andrebbe a colpi di assembler
Quindi mai "//", ma devi sbatterti a fare *\ */ - ![]() I long long? E chell'è mi ficchi tutto in una stringa e mi implementi l'addizione tra stringhe no? In C++... come sei matto? In c, ovviamente... mi scusi padrone P.S. ciò detto avete provato a compilare un ibrido C/C++ o un C++ vero e proprio? Io scommetto che i 2 eseguibili hanno dimensioni differenti se compilati da gcc con lstdc++ e da g++! |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Tieni presente che la differenza tra l'usare il g++ e gcc appare non solo in fase di compilazione, ma anche in fase di link, dove vengono aggiunte delle librerie aggiuntive specifiche per il linguaggio (il runtime del c++ ad esempio) Per cui se tu prima compili un sorgente c++, poi puoi linkarlo usando semplicemente gcc se aggiungi a mano le librerie che servono. Detto questo pero', ribadisco che secondo me non compila con gcc (a meno che uno non specifichi anche "-x c++" che e' praticamente identico ad usare direttamente g++)
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Se usate una versione non troppo recente del c, i commenti con // non erano previsti per cui e' normale che sia considerato errore (ma qualcuno avrebbe magari dovuto abilitare i flag -ansi per impedire di cadere nell'errore...)
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Il commento con // era una estensione non standard del gcc, per cui se non usi -ansi (o -pendantic anche ?) te lo da buono
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
I costruttori e distruttori di default fanno la stessa cosa che fanno in C, ovvero niente. Se non li dichiari a parte non dovrebbe esserci overhead.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2095
|
Quote:
Ultima modifica di fano : 16-01-2012 alle 00:14. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:18.





















