Une question de nouvelle novice tel quel. P>
5 Réponses :
La réponse est oui. Jetez un coup d'œil à ceci: p>
oui. Il n'y a aucune raison pour laquelle vous ne pouvez pas utiliser les bibliothèques C en C ++. Les choses changent si vous souhaitez compiler em> c dans un compilateur C ++. Le C ABI est entièrement pris en charge de C ++, mais les choses ne sont pas nécessairement si soignées du point de vue de l'API. Certains ajouts tels que restreindre code> ne sont pas dans la norme C ++, et doit être traité avec précaution. P>
Battez-moi de 30 secondes avec / la même réponse :)
@Merlyn Morgan-Graham: Les escaliers sont longs dans votre tour :)
Un cas plus extrême peut être une fonction qui prend un argument de type VLA, par exemple int foo (int n, char x [] [n]); code> - espérons que j'ai bien compris.
Pouvez-vous expliquer quand est le externe "c" code> des choses nécessaires?
@R ..: Ouais, intéressant! Je suppose que tout cette syntaxe Array ne vraiment i> fait quelque chose, mais il y a une énorme possibilité pour des en-têtes inutilisables.
Oui. Rester concentré sur la convention ABI et appelant. Heureusement, C a une convention d'appel solide et extrêmement bien soutenue, c'est l'une des nombreuses fonctionnalités de C.
Cela fait quelque chose - il déclare que vous passez une matrice / pointeur multidimensionnelle sur un tableau de longueur variable.
Restreindre ne fait pas partie de la norme C ++, mais presque chaque compilateur le supporte de toute façon.
@DeMlax: une bibliothèque C n'a pas ces choses. Même en utilisant une bibliothèque C ++ de C, vous pouvez contourner ces choses. Je réclame toujours avec véhémence, (et c'est pourquoi j'ai détesté "C ++ Blogs",) que c ++ est juste une tonne de métadonnées méchantes. Vous ne pouvez rien faire de C ++ que vous ne pouvez pas faire dans C.
@Matt MOXER: Pourquoi une bibliothèque C ne peut-elle pas avoir une fonction appelée neuf code>, Supprimer code> ou classe code>. Et si la bibliothèque C a une définition de la fonction int Func (taille_t n, char buf [n]) code> (paramètre de la variable de longueur de longueur)? Certaines choses en C ne peuvent pas être utilisées dans le code C ++.
@DeMlax: Oui Évidemment ce sont des exceptions. Les mots-clés ne sont pas exactement une révélation de quelque chose que vous ne pouvez pas utiliser de C. Même pour que vous puissiez toujours travailler autour d'eux, modifiez simplement l'en-tête pour utiliser de nouveaux noms et utiliser DLSYM () ou LoadLibrary () pour obtenir les noms de fonction s'ils sont au niveau de la liaison.
@DeMlax: De plus, je n'ai jamais entendu parler de VLA en tant que paramètre, je vais devoir vérifier cela. Est-ce ce que vous faites référence? gcc.gnu.org/onlinedocs/gcc/variable-length.htmlled/a >
@Matt Joiner: "Vous ne pouvez rien faire de C ++ que vous ne pouvez pas faire en C." Quel argument est-ce? Dans le même esprit, vous pourriez dire "Il n'y a rien dans C qui ne peut être fait dans Assembleur, alors revenons tous à l'assembleur!" C'est non-sens. C ++ est beaucoup plus que les méta-données ajoutées à C. Tout d'abord, c'est une philosophie de programmation différente i> (ou plutôt un tas de celui-ci si vous comptez les paradigmes pris en charge) et beaucoup d'ajouts syntaxiques (Plus de très peu de changements syntaxiques) pour soutenir cette ...
... Malgré la syntaxe similaire - juste cette philosophie, la chose en soi rendue C ++ plus différente de C que de delphes. En raison, de nombreuses bonnes pratiques de programmation en C sont en réalité de mauvaises pratiques de programmation en C ++.
@SBI: Il y a plus à la différence que des fonctionnalités. Cependant, sans troller, la seule chose tangible que C ++ ajoute que ce n'est pas des métadonnées est au niveau de la liaison. Une nouvelle convention d'appel, Nom Mangling et les tables VPTR implicites. Lorsque dans C ++, il ne faut certainement pas programmer le style C, mais je protège avec véhémence toute suggestion que préférant C sur C ++ est une mauvaise chose.
@Matt: Vous pourriez, avec le même raisonnement, protester avec véhémence toute suggestion d'écrire C au lieu de l'assembleur. Tout ce qui peut être fait en C peut être fait en assembleur, après tout. Et, lorsque vous arrivez au cœur des choses, C n'est qu'un assembleur de macro sur les stéroïdes. Bien sûr que cela ne ferait pas la justice. Mais le raisonnement est tout aussi fort (ou faible, FTM) comme le vôtre face au C ++. (Que voulez-vous dire, ce ne sont pas un argument rationnel? C'est vous qui a apporté à la table.)
Si les en-têtes sont correctement protégés avec extern "c" {...} code>, alors oui. p>
S'ils ne le sont pas, vous pouvez également créer vos propres en-têtes ou vous pourrez peut-être envelopper les personnes existantes.
Je n'appelerais pas mettre en place extern "c" {...} code> dans un en-tête pour le code de langue c-linguistique "approprié", mais la réponse de Stephen pourrait être interprétée comme mettant le extern "c" {...} code> autour du #include code> lignes.
@R ..: Bien sûr, on protège le extern "c" code> avec #if défini __cplusplus code> ou envoie l'inclusion à la place de l'en-tête lui-même. Pensé que c'était une donnée.
+1 pour mentionner le problème externe. Pour les identificateurs "Newbie" Poster - C ++ normalement "Mangles" dans un sous-ensemble de caractères que l'outil "Linker" prend en charge, alors que c ne doit pas (pas d'espaces de noms, surcharge, etc.). Ainsi, externe "c" indique au compilateur C ++ qu'un nom de fonction n'est pas / ne doit pas être mangé (lorsqu'il est défini respectivement de manière externe / interne à l'unité de compilation).
J'ai essayé #include extern "c" code>, fonctionne aussi, pourquoi?
@wamp: #include #include
Pouvez-vous expliquer quand est le externe "c" code> des choses nécessaires?
@Wamp: La plupart des en-têtes C standard assument les pires compilateurs C ++. Recherchez #Ifdef __cplusplus code> dans vos en-têtes C, ils enveloppent à peu près tout avec extern "c" code>.
@wamp: externe "C" code> est nécessaire pour la liaison C, je recommande fortement de faire une nouvelle question ou de creuser une nouvelle question, ou de creuser une existante pour cela.
oui, et non. p>
Les questions sont ... p>
Compond littéraux p> li>
DataTypes de numéro de complexe natif P> Li>
"restreindre" mot-clé p> li>
macros variadiques p> li>
"Long Long Int" DataType P> Li> ul>
Certaines de ces fonctionnalités de C sont incluses dans C ++ 0X et certaines sont disponibles comme extensions de bibliothèque dans de nombreux nouveaux compilateurs pour "Normal" C ++. P>
Cela dépend de quel niveau de C dont vous parlez, quel niveau de la norme C ++ et quelle plate-forme de quel compilateur depuis que les implémentations de compilateur ont toujours un support varié pour les normes et les bogues bien sûr. P>
et ensuite il y a des mots-clés utilisés en C ++ qui n'étaient pas définis dans C et sont donc disponibles pour être utilisés comme noms de variable en C mais faire un vomisseur C ++. En C, il est parfaitement légal d'utiliser les mots suivants comme des variables ou des noms de fonctions, mais ils fabriqueront évidemment C ++ lancer un ajustement Hissy ... P>
OH et "GOTO" se comporte différemment en C ++ et C. en C ++ "goto" ne peut pas être utilisé pour sauter sur une initialisation d'une variable, mais c'est correct pour C. identique à la même chose pour les déclarations de commutation. Dans C, vous pouvez écrire une instruction de commutation ou un ensemble de goto qui ne compilera pas en C ++. P>
Quoi d'autre? "Strchr" fonctionne différemment dans C vs C ++. En C, il renvoie un pointeur de char. En C ++, il renvoie un const em> strong> Pointeur de caractère. Si vous utilisez cette sortie de Strchr d'une certaine manière en C, cela pourrait souffler des morceaux en C ++ à cause de la correction de Const de C ++. P>
Les fonctions en ligne sont traitées différemment. En C, ils sont scopés au fichier, mais en C ++, ils ont une liaison externe par défaut. P>
C ++ Code a besoin de prototypes de fonctions définies avec extern "c" em> pour appeler une fonction C. p>
C ++ mangles symboles de noms de fonction mais c ne le fait pas. P>
" en théorie, il n'y a pas de différence entre théorie et pratique. Dans la pratique, il y a. em>" - Yogi Berra P>
Pourquoi certains descendent-ils? Ai-je commis une erreur?
Je pense que mon exemple de contreveille vous montrera pourquoi ce n'est pas toujours possible:
#ifndef HEADER_H #define HEADER_H int class(int a, int b); int private(int a); #endif
Pour être juste, personne ne devrait vraiment nommer leurs fonctions comme ça, mais cela prouve que toutes les bibliothèques C sont compatibles.
Mais si vous l'avez compilée dans une lib avec un compilateur C, vous pouvez utiliser la bibliothèque de C ++ - le nom Mangling s'en occupe
@Martin - Comment allez-vous utiliser ces fonctions en C ++?
Voulez-vous dire que les en-têtes de bibliothèque C standard C ou toute bibliothèque personnalisée écrite en C? Et quelle révision de C parle-t-on? Aussi avez-vous une plate-forme à l'esprit?
@Allbite: tout non pertinent pour la question.
Être que les implémentations varient de leur soutien exact pour la norme C ++, et il existe différentes versions de C et C ++ (comme dans C99, ANSI, C ++ 0X, etc.), certaines clarifications sont en ordre. Spécifiquement, demandez-vous de poser des fonctions de la bibliothèque C standard C. "Strcpy", ou êtes-vous une signification absolument tout personnalisé C libé par quelqu'un?