2010-08-26 11 views
10

Piuttosto una domanda da principianti così com'è.È vero che tutte le librerie c possono essere utilizzate in C++?

+0

Intendi le intestazioni di libreria C standard o qualsiasi libreria personalizzata scritta in C? E di quale revisione di C stiamo parlando? Hai in mente anche una piattaforma? – Allbite

+2

@Allbite: tutto irrilevante alla domanda. –

+0

Essendo che le implementazioni variano sul loro esatto supporto per lo standard C++, e ci sono diverse versioni di C e C++ (come in C99, ANSI, C++ 0x, ecc.), Alcuni chiarimenti sono in ordine. In particolare, però, stai chiedendo informazioni sulle funzioni standard della libreria C, ad es. "strcpy", o stai intendendo assolutamente qualsiasi C lib personalizzata scritta da chiunque? – Allbite

risposta

6

Sì. Non c'è ragione per cui non puoi usare le librerie C in C++. Le cose cambiano se si desidera compilare C in un compilatore C++. La C ABI è completamente supportata da C++, tuttavia le cose non sono necessariamente così chiare da una prospettiva API. Alcune aggiunte di C come restrict non sono nello standard C++ e devono essere gestite con attenzione.

+0

Beat me di 30 secondi con la stessa risposta :) –

+0

@Merlyn Morgan-Graham: le scale sono lunghe nella torre :) –

+2

Un caso più estremo potrebbe essere una funzione che accetta un argomento di tipo vla, ad esempio 'int foo (int n, char x [] [n]); '- spero di aver capito bene. –

2

Se le intestazioni sono protette correttamente con extern "C" { ... }, quindi si.

+0

Se non lo sono, puoi creare le intestazioni personali o potresti essere in grado di avvolgere quelli esistenti. –

+0

Non direi mettere 'extern "C"{...}' in un colpo di testa per il codice C-linguaggio "corretto", ma la risposta di Stephen potrebbe essere interpretato come mettere il 'extern "C"{...}' attorno alle righe '# include'. –

+2

@R ..: Naturalmente, uno protegge il 'extern" C "' con '#if definito __cplusplus', o racchiude l'inclusione al posto dell'intestazione stessa. Il pensiero era un dato. –

0

Sì, e no.

I questionables sono ...

  • letterali Compund

  • numero complesso Native tipi di dati

  • "limitare" parola chiave

  • macro variadic

  • "long long int" tipo di dati

Alcune di queste caratteristiche di C sono incluse in C++ 0x e alcuni sono disponibili come estensioni di libreria in molti compilatori più recenti C "normale" ++.

Quindi dipende dal livello di C di cui si sta parlando, dal livello dello standard C++ e dalla piattaforma di quale compilatore, poiché le implementazioni del compilatore hanno sempre un supporto vario per gli standard e gli errori, naturalmente.

E poi ci sono le parole chiave utilizzate in C++ che non sono stati definiti in C, e sono quindi disponibili per essere utilizzati come nomi di variabili in C, ma fare un compilatore C++ vomitare. In C è perfettamente legale per utilizzare le seguenti parole come variabili o nomi di funzioni, ma saranno ovviamente rendere C++ gettare un attacco isterico ...

  • modello
  • nuovo
  • classe

Oh e "goto" si comporta diversamente in C++ e C. In C++ "goto" non può essere usato per saltare l'inizializzazione di una variabile, ma va bene per C. Lo stesso vale per le istruzioni switch. In C puoi scrivere un'istruzione switch o una serie di goto che non verranno compilati in C++.

Cos'altro? "strchr" funziona in modo diverso in C vs C++. In C restituisce un puntatore char. In C++ restituisce un const puntatore char. Se si utilizza quell'output da strchr in un certo modo in C, si potrebbero soffiare blocchi in C++ a causa della correttezza const di C++.

Le funzioni inline vengono gestite in modo diverso.In C hanno un ambito per il file, ma in C++ hanno il collegamento esterno per impostazione predefinita.

Il codice C++ richiede i prototipi di funzione definiti con extern "C" per chiamare in una funzione C.

C++ maneggia i simboli dei nomi di funzione, ma C no.

"In teoria non v'è alcuna differenza tra la teoria e la pratica In pratica c'è.." - Yogi Berra

+0

Perché alcuni downvoting? Ho fatto un errore? – Allbite

0

penso che il mio esempio inventato vi mostrerà il motivo per cui non è sempre possibile:

#ifndef HEADER_H 
#define HEADER_H 
int class(int a, int b); 
int private(int a); 
#endif 

Perfettamente valido C ma non verrà compilato in C++, anche con un blocco "C" extern. Per quanto ne so l'unico modo per usare una libreria C del genere è creare un'altra libreria C che chiama quelle funzioni e quindi usare quella libreria wrapper nel codice C++.

Detto questo, penso che inciampare in qualcosa del genere nel "mondo reale" sia piuttosto raro.

+0

Per essere onesti, nessuno in realtà dovrebbe nominare le loro funzioni come quella, ma questo vuol dimostrare che non tutte le librerie C sono compatibili. – dreamlax

+1

Ma se è stato compilato in un lib con un compilatore C è possibile utilizzare la libreria in C++ - il nome storpiatura prende cura di esso –

+0

@ Martin - come si dovrebbe fare su come utilizzare queste funzioni in C++? –

Problemi correlati