PDA

View Full Version : C++ compilato con GCC (-lstdstdcc++)


fano
13-01-2012, 20:13
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++ :D

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?


Posso usare new() e delete()? Direi a naso, sì!
Posso cresare/estendere una classe? No... direi di no... che C è?
Posso usare ereditarietà? Boh?
e polimorfismo? No?
operator overloading? Assolutamente no, direi!
overloading di funzioni? Magara :p


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:


Usare GCC che è meno "anale" non rompe le scatole che debbo castare void* (perché è il jolly!) o che debbo fare un cast da int a short
Posso avere l'illusione di stare programmando in C legacy (molto legacy) così i capi non si accorgono che sto usando C++ mentre erano distratti! Ecco perché molti lo fanno... suppongo :Prrr:


Ditemi, ditemi son curioso come un cavallo :sofico:

pabloski
14-01-2012, 10:28
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++

fano
14-01-2012, 13:17
Allora vediamo se riesco a spiegarmi un pochino meglio supponiamo che io ho questo programmino che risiede in un .c:


int
main(void)
{
bubbu *a = new bubbu();

printf("This a C or C++ program?\n");

[...]

delete a;

return EXIT_SUCCES; /// = 0
}


La classe "bubbu" risiede in un libreria C++ compilata normalmente con g++; una normalissima libreria C++!

Supponiamo ora che io volglia compilare questo .c ho tre possibilità:


gcc -i test.c -o test ---> NON COMPILA non sa cosa sono new e delete
g++ -i test.c -o test ---> il compilato è un programma C++ il capo mi fa il cullo! Il C++ è VIETATO!
gcc -i test.c -o test -lstdc++ ---> il compilato è un programma C? Che però conosce qualcosa anche del C++... conosce tutto? Tutto, tutto? C++ è una libreria :eek: ? Io non credo :Prrr: Comunque il capo è fregato :ciapet:


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 ;) ) quindi SO che va... ma NON so come fa a farlo :stordita:

Lo so, lo so certe curiosità a volte è meglio tenersele... ora voi mi dite che NON potrebbe funzionare magar :p

pabloski
14-01-2012, 14:32
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++

pabloski
14-01-2012, 15:29
io sapevo questo:

http://www.bo.cnr.it/corsi-di-informatica/corsoCstandard/Lezioni/16Linuxgcc.html

quindi continuo a non capire quanto sia fondamentale questa differenza... :confused:

vecchiotta come guida

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

fano
14-01-2012, 19:45
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++

Mai quando ha compilato con listdc++?

Il gcc liscio, ovviamente, sì non è in grado di compilarlo :Prrr:

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 è:


Un programma C che linka semplicemente delle librerie con un nome esotico (libbubu e libstdcc++) :sofico:
Un programma C++ perchè g++ è gcc solo che automaticamente linkato col C++ runtime (aka libstdc++ come sapete)
Un programma né C né C++, ma qualcosa di più esotico... uno strano ibrido C+ o C--?


Ce dite?

fano
14-01-2012, 20:35
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...?

pabloski
14-01-2012, 20:55
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ì.

Agat
14-01-2012, 21:22
Più banalmente, un vero compilatore c, con un commento // dovrebbe dare errore :D

GByTe87
14-01-2012, 22:14
Più banalmente, un vero compilatore c, con un commento // dovrebbe dare errore :D

Eddai, almeno il c99 usiamolo! Oramai dovrebbe essere ben collaudato. :D

fano
15-01-2012, 17:37
Sapete che una volta Io fui ripreso per un semplice "//" ???

... non scherzo mica eh :Prrr:

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 :cry:) quindi abbiamo che:


Assembeler è roba da "Veri Programmatori"(tm)
C sei una ballerina
C++ è roba da signorine :confused:
JAVA sei un po' "equivoco" :ciapet:
C# sei al limite del satanismo :mad:
...ruby on rails? Ti distrai un attimo e hanno già iniziato a farti un bel rogo... SATANISTA!!!! :muro: :muro: :muro:


Quindi mai "//", ma devi sbatterti a fare *\ */ -:)) e ^-? :mbe:

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 :D :D :D

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++!

marco.r
15-01-2012, 19:55
gcc -i test.c -o test ---> NON COMPILA non sa cosa sono new e delete
g++ -i test.c -o test ---> il compilato è un programma C++ il capo mi fa il cullo! Il C++ è VIETATO!
gcc -i test.c -o test -lstdc++ ---> il compilato è un programma C? Che però conosce qualcosa anche del C++... conosce tutto? Tutto, tutto? C++ è una libreria :eek: ? Io non credo :Prrr: Comunque il capo è fregato :ciapet:


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 ;) ) quindi SO che va... ma NON so come fa a farlo :stordita:

Lo so, lo so certe curiosità a volte è meglio tenersele... ora voi mi dite che NON potrebbe funzionare magar :p
Uhm, che versione di gcc usate ? Perche' a me risulta che il codice sopra con una versione abbastanza recente di gcc non viene compilato (non riconosce il costrutto new).
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++)

marco.r
15-01-2012, 19:58
Sapete che una volta Io fui ripreso per un semplice "//" ???

... non scherzo mica eh :Prrr:

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...)

marco.r
15-01-2012, 20:00
Più banalmente, un vero compilatore c, con un commento // dovrebbe dare errore :D

Il commento con // era una estensione non standard del gcc, per cui se non usi -ansi (o -pendantic anche ?) te lo da buono

marco.r
15-01-2012, 20:01
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 ;)

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.

fano
15-01-2012, 23:11
Uhm, che versione di gcc usate ? Perche' a me risulta che il codice sopra con una versione abbastanza recente di gcc non viene compilato (non riconosce il costrutto new).
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++)

Attualmente 4.6, prima 4.2... direi se non erro sia possibile linkare (non so compilare un intero programma C++) in un programma C una libreria C++ e compilare il tutto con gcc ma è obbligatorio aggiungere tra le librerie libstdc++; è probabile a sto punto sia di fatto ciò che fa g++... l'unica differenza sarebbe nella minor pedanteria del compilatore :p

marco.r
15-01-2012, 23:32
Attualmente 4.6, prima 4.2... direi se non erro sia possibile linkare (non so compilare un intero programma C++) in un programma C una libreria C++ e compilare il tutto con gcc ma è obbligatorio aggiungere tra le librerie libstdc++; è probabile a sto punto sia di fatto ciò che fa g++... l'unica differenza sarebbe nella minor pedanteria del compilatore :p

Ah si', ma collegare non e' un problema. D'altra parte puo' effettivamente capitare di dover mettere assieme pezzi di programma generati da linguaggi differenti, anche se non e' molto frequente. Un classico esempio e' mescolare codice Fortran e C. Tieni presente che gcc e g++ di per se' non collegano. Si occupano solo di chiamare ld con i file oggetto e i parametri opportuni.