Executando verificação de segurança...
0

Qual a melhor prática em C?

Em um diretório específico, "e", do meu projeto, existem vários arquivos .h. Em outros dois diretórios, "p" e "l", preciso incluir um conjunto desses arquivos .h.

Atualmente, os arquivos dos diretórios "p" e "l" possui multiplos includes para o diretório "e":

./p/something.c
./l/something.c

#include <e/sample1.h>
#include <e/sample2.h>
#include <e/sample3.h>

Porém, eu não vejo isso acontecendo nas bibliotecas padrões. Então, pensei em criar um único arquivo .h que exportaria tudo o que fosse necessário em outros diretórios:

./e/extern.h

#include <e/sample1.h>
#include <e/sample2.h>
#include <e/sample3.h>

E então, eu importaria apenas esse único header:

./p/something.c
./l/something.c

#include <e/extern.h>

Isso é uma coisa interessante a se fazer ou pode levar a bugs inesperados como dependências circulares? Lembrando que um arquivo .c dentro do diretório "e" jamais iria incluir sse extern.h

Carregando publicação patrocinada...
1

Não há nada de errado (vide stdlib.h).

Porém evite a redefinição, aplicando a condição abaixo em cada um dos headers:

#ifndef _SAMPLE1_H_
#define _SAMPLE1_H_

#endif

Dependências circulares não estão relacionadas a sua questão. Ela só vai ocorrer se seu arquivo e/extern.h ou e/sample1.h incluir headers dos diretórios que previamente os incluem.

0

A primeira "melhor prática" seria dar nomes mais significativos para as coisas.

A segunda seria não buscar receitas de bolo assim, que as pessoas chamam de boas práticas e olhar o contexto, tentar achar uma solução de acordo com o que precisa.

Não temos o contexto, não sabemos nada do que tem dentro disso. A intenção é o que definirá qual é a melhor.

Sem contexto algum eu chutaria que o primeiro é mais adequado. Pelo menos até ter uma boa justificativa para fazer o segundo. Assim deixa mais explícito o que está "importando". Eu não estou conseguindo ver algum ganho em criar uma camada a mais.

A não ser que eu tenha entendido algo errado.

Espero ter ajudado.


Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

1

Todos os nomes citados foram ilustrativos.

Para contextualizar mais, dentro de "extern.h" iria ser incluido todas as funções e estruturas que outros diretórios usariam, assim, eu consigo incluir tudo com apenas um header, ao invés de, como no exemplo, 3. O tradeoff que eu acredito existir é que eu ganho simplicidade na hora de importar as funções mas perco alguns ms (imperceptivel) na hora de compilar. Isso simplifica as coisas pra mim (tenho uma grande dificuldade pra ler, e entender, coisas "empilhadas"), mas, ainda existe a dúvida se é, ou não, algo "recomendável" a se fazer. Simplificando, um barrel file em typescript/javascript.

De toda forma, agradeço a contribuição, acredito que irei continuar com as múltiplas diretrizes

2

Ainda sim depende.

O mais comum - ou o único caso - é precisar importar tudo? Se for, talvez valha a pena criar o extern.h.

Tem casos em que precisa importar apenas um ou alguns, mas não necessariamente todos? Aí teria que importar um a um. Se precisa de todos em um caso muito específico, talvez não justifique criar o extern.h.

Sem mais informações, é o que dá pra dizer. Cada caso é um caso, não tem a fórmula mágica que funciona pra qualquer situação.

Talvez ajude - mas é pra ler tudo, pois tem opiniões diversas (não é pra ler só o primeiro que vc gostar e achar que aquilo é "a verdade", o importante ali é ler todos os pontos de vista, que te farão pensar no seu caso).