Pourquoi ne pas en C ANSI, ont des espaces de noms?
Avoir des espaces de noms semble évident pour la plupart des langues. Mais aussi loin que je peux dire, C ANSI ne le supporte pas. Pourquoi pas? Tous les plans de l'inclure dans une future norme?
- Utilisation de C++ qu'en C-avec-espace de noms!
- Je peux, bien sûr, mais je voudrais encore savoir
- Becke Quel est le problème avec C++ espaces de noms?
- 2 choses. Inutile distinctif de la syntaxe: Toutes les autres langues, avec des espaces de noms utilisez simplement". " comme séparateur qu'il ne soit pas ambiguë avec d'autres utilisations de '.'. Et, de façon plus critique, c++ n'a jamais accepté une étendue à l'aide de la directive. Ce qui signifiait que les programmeurs galvaudé à l'aide de directives pour importer des espaces de noms dans la portée globale. Ce qui signifie que le c++ comité des normes de maintenant ne peuvent pas ajouter de nouvelles fonctionnalités à std:: jamais, car la quantité de code qui briserait comme un résultat a rendu le partitionnement redondant.
- Becke: j'aime distinctif de la syntaxe. Je voudrais savoir si je suis à la recherche d'une classe dans un espace de nom ou à un membre d'une classe.
- Je pense que les gens les mieux qualifiés pour répondre à cette question ont été/sont sur le C ANSI comité. J'espère que quelqu'un à partir de l'un des comités est ici. Ou demander à une liste de diffusion avec quelqu'un qui a été, peut-être?
- c'est un quelques années de retard, mais c'est intéressant que vous soutenez que le C++ espaces de noms ont été mal mis en œuvre, de sorte qu'ils ne devraient pas être mis en œuvre dans C. Alors vous remarquez que les autres langues en œuvre sans le décrochement de C++. Si d'autres langues peut le faire, pourquoi ne pas les initier à C?
- n'utilisez jamais de
using namespace ...
en C++, en-têtes, du moins pas quand vous écrivez en-têtes publics, comme une bibliothèque 😉
Vous devez vous connecter pour publier un commentaire.
C n'ont d'espaces de noms. Un pour les balises de structure, et une pour les autres types. Considérez la définition suivante:
Le premier a tag foo, et plus tard est faite dans le type foo avec un typedef. Pas encore de nom-des affrontements qui se passe. C'est parce que les balises de structure et les types (types intégrés et typedef ed types) de séparer les espaces de noms.
Ce que le C ne permet pas de est de créer nouveau espace de noms par la volonté. C était normalisé avant cela a été considéré comme important dans une langue, et l'ajout d'espaces de noms menace la compatibilité ascendante, car il requiert un nom d'amputation à l'œuvre. Je pense que cela peut être attribué pour des raisons techniques, pas de la philosophie.
EDIT:
JeremyP heureusement m'a corrigé et a mentionné les espaces de noms que j'ai raté. Il y a des espaces pour les étiquettes et pour les struct/union aussi bien les membres.
struct foo
comme "lastruct foo
de l'espace de noms"?struct
définition déclare un nouvel espace de noms pour ses membres. Je ne dis pas exploiter ce fait, je ne suis pas au courant de tous les moyens de l'exploiter depuisstruct
s ne peut pas avoir des membres statiques.Pour être complet, il existe plusieurs façons d'atteindre les "avantages" que vous pourriez obtenir à partir d'espaces de noms, dans C.
L'un de mes préférés méthodes est d'utiliser une structure à la maison un tas de méthode pointeurs qui sont à l'interface de votre bibliothèque/etc..
Vous utilisez ensuite un extern instance de cette structure qui vous initialisez à l'intérieur de votre bibliothèque vers toutes vos fonctions. Cela vous permet de garder vos noms simples dans votre bibliothèque sans marcher sur les clients de l'espace de noms (autres que la extern variable à portée mondiale, 1 variable vs éventuellement des centaines de méthodes..)
Il y a plus de maintenance en cause, mais j'ai l'impression que c'est minime.
Voici un exemple:
L'utilisation de . syntaxe crée une association forte de plus de la classique Library_function() Library_some_value méthode. Il existe toutefois certaines limitations, pour un, vous ne pouvez pas utiliser les macros comme des fonctions.
library.method1()
?.c
fichiers statiques par défaut, donc la seule les fonctions exposées sont celles explicitement exposés dans leconst struct
définition dans le.c
fichier.function1
/method2
lors de la compilation avec les deux-O2
et-flto
. Sauf si vous compilez ces bibliothèques avec votre propre source, cette approche permettra d'ajouter une surcharge de ses appels de fonction.C a des espaces de noms. La syntaxe est
namespace_name
. Vous pouvez même nid comme dansgeneral_specific_name
. Et si vous voulez être en mesure d'accéder à des noms sans écrire le nom d'espace de noms à chaque fois, inclure le préprocesseur macros dans un fichier d'en-tête, par exempleC'est beaucoup plus propre que le nom de déformation et les autres atrocités certaines langues s'engagent à offrir des espaces de noms.
$
et.
caractères, et la classe imbriquée les noms ne sont pas laids.using
, ce n'est pas un espace de noms. Si vous ne pouvez pas joindre des définitions dansnamespace foo { /* etc. etc. */ }
ce n'est pas un espace de noms.namespace_name
mais le recommander comme une solution semble idiot, au mieux. Je pense que le principal problème est que les gens qui proposent ce type de solutions n'ont pas vraiment eu la chance d'utiliser de "vrais" espace de noms.Historiquement, les compilateurs C ne pas coder les noms (ils n'sur Windows, mais la déformation de la
cdecl
convention d'appel se compose de seulement l'ajout d'un trait de soulignement préfixe).Cela facilite l'utilisation de bibliothèques C à partir d'autres langues (y compris assembleur) et est l'une des raisons pourquoi vous voyez souvent
extern "C"
des wrappers pour C++ Api.juste des raisons historiques. personne n'a pensé à quelque chose comme un espace de noms à l'époque. Aussi, ils étaient vraiment en essayant de garder un langage simple. Ils peuvent avoir dans l'avenir
Pas une réponse, mais pas un commentaire. C ne fournit pas un moyen de définir
namespace
explicitement. Il a de la portée des variables. Par exemple:Vous pouvez utiliser un des noms de variables et de fonctions:
La seule différence avec les espaces de noms que vous ne pouvez pas être
using
et ne peut pas importerfrom mylib
.namespace mylib { void init(); void say_hello(); }
qui est également important(ish).Parce que les gens qui veulent ajouter cette fonctionnalité à C n'ont pas formé et organisé pour mettre la pression sur le compilateur auteur des équipes et sur les organes de l'ISO.
ANSI C a été inventé avant les espaces de noms ont été.
C ne supporte pas les espaces de noms tels que C++. La mise en œuvre de C++ espaces de noms marquer les noms. L'approche décrite ci-dessous permet de bénéficier d'espaces de noms en C++, tout en ayant des noms qui ne sont pas déformés. Je me rends compte que la nature de la question est pourquoi ne pas C support des espaces de noms (et un trivial réponse serait qu'il ne veut pas parce qu'il n'a pas été implémentée :)). J'ai juste pensé que ça pourrait aider quelqu'un à voir comment j'ai mis en œuvre la fonctionnalité de modèles et d'espaces de noms.
J'ai écrit un tutoriel sur comment pour obtenir l'avantage d'espaces de noms et/ou des modèles à l'aide de C.
Les espaces de noms et les templates en C
Les espaces de noms et les templates en C (à l'aide de Listes chaînées)
Pour la base de l'espace de noms, il suffit de préfixer le nom d'espace de noms de la convention.
peut être écrite comme
Une deuxième approche que j'ai eu besoin de qui utilise le concept de namespacing et modèles consiste à utiliser la macro de concaténation et de les inclure. Par exemple, je peux créer un
à l'aide de fichiers de modèle comme suit
multipliez-modèle.h
multipliez-modèle.c
Nous pouvons maintenant définir int_multiply comme suit. Dans cet exemple, je vais créer un int_multiply.h/.c fichier.
int_multiply.h
int_multiply.c
À la fin de tout cela, vous aurez une fonction et un fichier d'en-tête.
J'ai créé un beaucoup plus détaillée de tutoriel sur les liens ci qui montrent comment il fonctionne avec les listes chaînées. Espérons que cela aide quelqu'un!