É recomendável ter arquivos de cabeçalho C ++ sem extensão?

9

Eu tenho uma discussão com um colega meu sobre as diretrizes C ++ a seguir.

Atualmente, ele cria todas as suas bibliotecas dessa maneira:

  • Ele usa letras inconsistentes em maiúsculas e minúsculas em seus nomes de arquivos
  • Alguns de seus cabeçalhos não têm extensão

Acredito que não ter extensão é algo reservado para arquivos padrão do C ++ e que o uso de letras maiúsculas é suscetível a erros (especialmente quando você lida com código que deve funcionar tanto no Windows quanto no Linux).

Seu argumento é que ele segue as Qtconvenções (mesmo para o código que não usa Qt) e continua dizendo: "Se o Qt faz dessa maneira, então não pode ser ruim".

Agora tento manter a mente aberta, mas me sinto muito mal quando tenho que trabalhar / com suas bibliotecas. Existe um conjunto comum de regras estabelecidas sobre isso? O padrão diz algo sobre isso?

Muito obrigado.

ereOn
fonte
3
#define signal……… ("Se o Qt fizer dessa maneira, não poderá ser ruim.") - Não posso dizer que concordo pessoalmente com todas as opções de design.
Just
@ Justin: Nem eu. Não tenho nada contra Qt. Eu até acho que é uma biblioteca incrível, mas algumas de suas opções de design realmente me parecem erradas.
ereOn
11
@ Justin Eu vi macros começando _no código popular e amplamente usado, mas é definitivamente contra o padrão.
Luchian Grigore
11
mas aqui está um motivo real para evitar cabeçalhos sem extensões: meu IDE e editor de texto principais não os reconhecerão automaticamente. Eu apenas uso *.hpppara um cabeçalho c ++, e todas as minhas ferramentas "obtê-lo".
Just
5
O Qt usa essa convenção exatamente porque os programadores inteligentes não. Isso significa que seus cabeçalhos não entrarão em conflito com os novos cabeçalhos Qt.
MSalters

Respostas:

16

A extensão (ou falta de) não vai causar, até onde sei, problemas. Eu diria que descartar completamente a extensão é inconveniente, pois dificulta a pesquisa de arquivos de cabeçalho (por exemplo, com os curingas *. He *. Hpp) e torna mais difícil identificar o conteúdo de um arquivo (por exemplo, se seu editor depende da extensão para escolher o modo de destaque de sintaxe apropriado).

Do ponto de vista do código, não faz muita diferença, mesmo a caixa não é problemática, desde que você use um caso consistente em qualquer lugar e não confie apenas nas diferenças de caso para diferenciar arquivos. Do ponto de vista da conveniência, é mais fácil usar letras minúsculas e ter uma extensão (.h ou .hpp).

Mais importante que qualquer uma das opções acima, no entanto, é escolher uma convenção para toda a equipe de desenvolvimento e cumpri-la . É muito pior ter que procurar como um arquivo é invocado, nomeado e qual extensão ele usa sempre que você deseja incluir algo - tudo isso deve ser "adivinhado" com o conhecimento do que você está tentando usar.

Adam Bowen
fonte
Escolher uma convenção e cumpri-la não é uma má idéia, mas e se a convenção existente puder ser melhorada? Nesse caso, talvez seja uma boa ideia alterar o curso.
21412 kotlinski
@kotlinski Este é um daqueles casos em que não há nada que você possa fazer para melhorar a situação, porque qualquer coisa que você escolher é uma questão de preferência. Na verdade, ter alguma extensão, eu diria, é melhor que nenhuma, porque o SO (leitura, Windows) pode determinar com qual programa abrir o arquivo com base na extensão.
Paul
@PaulManta: Mas você não está argumentando contra si mesmo aqui? Primeiro, você diz que não há como melhorar nada. Então, você diz que ter uma extensão é melhor do que não. Esse é um tipo de atitude derrotista, dizendo que nenhuma mudança é possível.
21412 kotlinski
@kotlinski Em geral, acho que depende de quanto código antigo você trabalharia, se seria viável mudar tudo para a nova convenção e qual seria o impacto das convenções de mixagem. Nesse caso, embora eu concorde com Paul Manta - é principalmente uma preferência pessoal, com uma extensão sendo preferida pela maioria por razões práticas.
Adam Bowen
11
@kotlinski Não há como melhorar nada, mas há maneiras de piorar as coisas. Essa discussão é tão inútil quanto a discussão sobre espaços versus tabulações. Basta escolher uma convenção e fazer algo útil.
Paul
6

Não há regra (no padrão) de que apenas os arquivos de cabeçalho padrão possam estar sem uma extensão; o nome do arquivo pode ser praticamente o que você quiser. As boas práticas gerais, no entanto, sugerem que:

  1. nenhum arquivo jamais terá uma extensão e

  2. tipos diferentes de arquivos têm extensões diferentes - em particular, os cabeçalhos C ++ usam uma extensão ( .hppou .hh) diferente dos cabeçalhos aceitáveis ​​para um compilador C.

(Lamentavelmente, a segunda regra é frequentemente violada e geralmente se vê arquivos de cabeçalho C ++ .h. Por experiência pessoal, posso garantir que isso causará problemas de manutenção no futuro, mas é uma prática comum.)

Com relação ao caso, é necessário extremo cuidado, pois os nomes de arquivos diferenciam maiúsculas de minúsculas em alguns sistemas e não em outros. Eu vi duas regras diferentes que funcionam: tudo em letras minúsculas no nome do arquivo ou o nome do arquivo segue exatamente as mesmas regras referentes a maiúsculas e minúsculas que os símbolos em C ++.

Nos dois casos, você estabelece regras para o projeto, por consenso, e todos as seguem.


fonte
11
Estou totalmente com James neste. Isso torna um pesadelo fazer com que as ferramentas funcionem adequadamente nos 2 tipos diferentes de arquivos de cabeçalho, se tiverem a mesma extensão.
@ TomTanner E é ainda pior se você tiver arquivos sem extensões. Eu trabalhei principalmente em um ambiente Unix, e sempre me frustrou (e causou problemas) que os arquivos executáveis ​​não tenham extensão.
6
If Qt does it that way, then it can't be bad.

Sim. Sim, pode mesmo. O design da biblioteca é "Nós queremos muito ser Java". É uma bagunça total. A biblioteca padrão é muito melhor.

Além disso, fundamentalmente, é uma falácia lógica. O design do Qt só vale a pena emular se você pode fornecer argumentos lógicos sobre por que é bom, não é bom apenas porque é Qt.

DeadMG
fonte
É um argumento empírico. É um grande produto de software usado por muitas pessoas. Se essa opção de convenção de nomenclatura causasse problemas significativos, ela seria conhecida e provavelmente alterada até agora. Como esse não é o caso, não pode ser tão ruim. Isso não significa que é a melhor solução, no entanto.
H. Rittich 18/09/19
0

Como eu sei, desde o padrão de 1998, apenas os cabeçalhos de bibliotecas padrão ficariam sem o .h. Portanto, os arquivos de cabeçalho C ++ não padrão ainda são convencionalmente gravados com .h. Mas lembre-se de que é uma convenção, você não pode usar nenhuma extensão ou mesmo extensão .txt, é como se você escrevesse suas aulas começando com letras minúsculas, ainda está funcionando, mas não é a convenção.

Mario Corchero
fonte
3
Btw "Se Qt faz dessa maneira, então não pode ser ruim." É um argumento muito ruim ...
2
O padrão não tem nada a dizer sobre como cabeçalhos definidos pelo usuário devem ser nomes. Ele especifica apenas os nomes dos cabeçalhos padrão.
Mike Seymour
0

Estas são convenções, não regras, não há restrições para aderir a convenções, mas convenções tornam a vida mais fácil quando você procura referências.

de acordo com as extensões (.h, .hpp), os arquivos que foram incluídos no c ++ não precisam de extensões, você precisará usá-las se estiver usando cabeçalhos de outros que não c ++, como bibliotecas c ou bibliotecas de reforço.


fonte