Ter namespaces parece óbvio para a maioria das linguagens. Mas, pelo que eu posso dizer, ANSI C não o suporta. Por que não? Algum plano de incluí-lo em um padrão futuro?
c
namespaces
ansi-c
Pulkit Sinha
fonte
fonte
Respostas:
C tem namespaces. Um para tags de estrutura e outro para outros tipos. Considere a seguinte definição:
O primeiro possui tag foo, e o último é transformado no tipo foo com um typedef. Ainda assim, nenhum conflito de nomes acontece. Isso ocorre porque as tags e os tipos de estrutura (tipos integrados e tipos definidos por tipo) vivem em namespaces separados.
O que C não permite é criar um novo namespace por vontade própria. C foi padronizado antes de ser considerado importante em uma linguagem, e adicionar namespaces também ameaçaria a compatibilidade com versões anteriores, porque requer a mutilação de nomes para funcionar corretamente. Acho que isso pode ser atribuído a aspectos técnicos, não à filosofia.
EDIT: JeremyP felizmente me corrigiu e mencionou os namespaces que perdi. Existem namespaces para rótulos e também para membros de estrutura / união.
fonte
struct
definição declara um novo namespace para seus membros. Não estou defendendo a exploração desse fato, nem estou ciente de qualquer meio de explorá-lo, já questruct
s não podem ter membros estáticos.Para completar, existem várias maneiras de obter os "benefícios" que você pode obter dos namespaces, em C.
Um dos meus métodos favoritos é usar uma estrutura para abrigar vários ponteiros de método que são a interface para sua biblioteca / etc.
Você então usa uma instância externa dessa estrutura que você inicializa dentro de sua biblioteca apontando para todas as suas funções. Isso permite que você mantenha seus nomes simples em sua biblioteca sem pisar no namespace do cliente (além da variável externa no escopo global, 1 variável vs possivelmente centenas de métodos ..)
Há alguma manutenção adicional envolvida, mas sinto que é mínima.
Aqui está um exemplo:
O uso de . a sintaxe cria uma associação forte sobre o método clássico Library_function () Library_some_value. Existem algumas limitações, no entanto, para quem você não pode usar macros como funções.
fonte
library.method1()
?.c
arquivos estáticas por padrão, portanto, as únicas funções expostas são aquelas explicitamente expostas naconst struct
definição do.c
arquivo.function1
/method2
ao compilar com-O2
e-flto
. A menos que você compile essas bibliotecas junto com seu próprio código-fonte, essa abordagem adicionará alguma sobrecarga às chamadas de função.C tem namespaces. A sintaxe é
namespace_name
. Você pode até aninhá-los como emgeneral_specific_name
. E se você quiser ser capaz de acessar nomes sem escrever o nome do namespace todas as vezes, inclua as macros de pré-processador relevantes em um arquivo de cabeçalho, por exemploIsso é muito mais limpo do que mutilar nomes e outras atrocidades que certas linguagens cometem para entregar espaços de nomes.
fonte
Historicamente, os compiladores C não alteram os nomes (eles fazem no Windows, mas a alteração da
cdecl
convenção de chamada consiste em apenas adicionar um prefixo de sublinhado).Isso facilita o uso de bibliotecas C de outras linguagens (incluindo assembler) e é um dos motivos pelos quais você costuma ver
extern "C"
wrappers para APIs C ++.fonte
apenas razões históricas. ninguém pensou em ter algo como um namespace naquela época. Além disso, eles estavam realmente tentando manter a linguagem simples. Eles podem ter isso no futuro
fonte
Não é uma resposta, mas não um comentário. C não fornece uma maneira de definir
namespace
explicitamente. Ele tem escopo variável. Por exemplo:Você pode usar nomes qualificados para variáveis e funções:
A única diferença dos namespaces é que você não pode ser
using
e não pode importarfrom mylib
.fonte
namespace mylib { void init(); void say_hello(); }
quais também é importante (ish).ANSI C foi inventado antes dos namespaces.
fonte
Porque as pessoas que desejam adicionar esse recurso ao C não se reuniram e se organizaram para colocar alguma pressão nas equipes de autores de compiladores e nos órgãos ISO.
fonte
C não oferece suporte a namespaces como C ++. A implementação de namespaces C ++ destrói os nomes. A abordagem descrita a seguir permite que você obtenha o benefício de namespaces em C ++ enquanto tem nomes que não são mutilados. Eu percebo que a natureza da questão é por que C não suporta namespaces (e uma resposta trivial seria que não, porque não foi implementado :)). Só pensei que poderia ajudar alguém a ver como implementei a funcionalidade de modelos e namespaces.
Eu escrevi um tutorial sobre como obter a vantagem de namespaces e / ou modelos usando C.
Namespaces e modelos em C
Namespaces e modelos em C (usando listas vinculadas)
Para o namespace básico, pode-se simplesmente prefixar o nome do namespace como uma convenção.
pode ser escrito como
Uma segunda abordagem necessária que usa o conceito de namespacing e modelos é usar a concatenação de macro e incluir. Por exemplo, posso criar um
usando arquivos de modelo como segue
multiply-template.h
multiply-template.c
Agora podemos definir int_multiply da seguinte maneira. Neste exemplo, vou criar um arquivo int_multiply.h / .c.
int_multiply.h
int_multiply.c
No final de tudo isso, você terá uma função e um arquivo de cabeçalho para.
Criei um tutorial muito mais detalhado nos links fornecidos, que mostram como funciona com listas vinculadas. Espero que isso ajude alguém!
fonte