Tenho um tipo Type_##type
dependente de uma determinada macro type_create:
#define type_create(type) { \
typedef struct { \
type* ptr, \
} Type_##type; \
e tenho algumas macros dependentes dele. Agora estou pensando se posso fazer algo como #ifndef
para um tipo, por exemplo,
#ifndef Type_int
type_create(int);
#endif
exceto para tipos.
O pré-processador C não sabe nada sobre a semântica C do código em que opera. Ele não consegue determinar se há uma declaração de um tipo de dado C no escopo em algum ponto específico. C especifica macros de teste de recursos para realizar esse tipo de teste para recursos opcionais da linguagem, mas, como programador C, espera-se que você tenha pleno conhecimento de todos os identificadores que você mesmo declara.
Convencionalmente, coloca-se todas as declarações necessárias de escopo de arquivo no topo do arquivo-fonte, diretamente ou inserindo
#include
cabeçalhos nessa posição. Entre outras coisas, isso facilita bastante a verificação do que foi declarado em caso de dúvida. Para qualquer coisa declarada diretamente em vez de por meio de um cabeçalho, acho que ajuda colocar as declarações após todos os#include
s e agrupá-las por tipo: tipos, objetos, protótipos de função e, por fim, definições de função. O fato de você estar usando macros para escrever algumas das suas definições de tipo não torna isso menos apropriado, mas talvez você queira agrupá-las em um grupo maior de declarações de tipo.Além disso, se você quiser usar macros para declarar várias coisas relacionadas, como um tipo de estrutura e protótipos para várias funções associadas a ele, provavelmente faz sentido usar uma única macro para declarar tudo isso junto. Não custa nada declarar funções, tipos ou objetos externos aos quais você nunca faz referência, desde que essas declarações não sejam definições.