Com relação à análise das diretivas do pré-processador, o padrão C99 (e o padrão C89 antes dele) eram claros sobre a seqüência de operações realizadas logicamente pelo compilador. Em particular, acredito que significa que este código:
/* */ # /* */ include /* */ <stdio.h> /* */
é equivalente a:
#include <stdio.h>
Para melhor ou pior, o GCC 3.4.4 com '-std = c89 -pedantic' aceita a linha de comentários carregados, de qualquer forma. Não estou defendendo isso como um estilo - nem por um segundo (é horrível). Só acho que é possível.
ISO / IEC 9899: 1999 seção 5.1.1.2 Fases de tradução diz:
[Mapeamento de caracteres, incluindo trígrafos]
[Linha de emenda - removendo barra invertida de nova linha]
O arquivo de origem é decomposto em tokens de pré-processamento e sequências de caracteres de espaço em branco (incluindo comentários). Um arquivo de origem não deve terminar em um token de pré-processamento parcial ou em um comentário parcial. Cada comentário é substituído por um caractere de espaço. Os caracteres de nova linha são mantidos. Se cada sequência não vazia de caracteres de espaço em branco diferente de nova linha for mantida ou substituída por um caractere de espaço, é definido pela implementação.
As diretivas de pré-processamento são executadas, as invocações de macro são expandidas, [...]
A seção 6.10 Diretrizes de pré-processamento diz:
Uma diretiva de pré-processamento consiste em uma sequência de tokens de pré-processamento que começa com um # token de pré-processamento que (no início da fase de tradução 4) é o primeiro caractere do arquivo de origem (opcionalmente após o espaço em branco sem caracteres de nova linha) ou que segue o espaço em branco contendo pelo menos um caractere de nova linha e é finalizado pelo próximo caractere de nova linha.
A única disputa possível é a expressão entre parênteses '(no início da fase 4 de tradução)', o que poderia significar que os comentários antes do hash devem estar ausentes, uma vez que não são substituídos por espaços até o final da fase 4.
Como outros notaram, os pré-processadores C pré-padrão não se comportavam uniformemente de várias maneiras, e os espaços antes e nas diretivas do pré-processador era uma das áreas em que diferentes compiladores faziam coisas diferentes, incluindo o não reconhecimento de diretivas de pré-processador com espaços à frente deles .
É digno de nota que a remoção da barra invertida-nova linha ocorre antes de os comentários serem analisados. Conseqüentemente, você não deve terminar os //
comentários com uma barra invertida.
#ifdef
linhas nas partes em que tenho o código real. Em vez disso, se preciso de coisas condicionais, coloco-as em funções fatoradas ou em macros fatoradas; é muito mais claro assim que eu acho (bem, pelo menos é para mim). Idealmente, todas essas partes fatoradas estarão em outros arquivos (cabeçalhos ou arquivos de origem compilados condicionalmente; a "condição" usual é a plataforma para a qual o código está sendo construído).Para o exemplo que você deu, pode ser apropriado usar recuo para torná-lo mais claro, visto que você tem uma estrutura complexa de diretivas aninhadas.
Pessoalmente, acho útil mantê-los sem recuo na maioria das vezes, porque essas diretivas operam separadamente do resto do código. Diretivas como #ifdef são tratadas pelo pré-processador, antes que o compilador veja seu código, então um bloco de código após uma diretiva #ifdef pode nem mesmo ser compilado .
Manter as diretivas visualmente separadas do resto do código é mais importante quando elas são intercaladas com o código (em vez de um bloco dedicado de diretivas, como no exemplo que você fornece).
fonte
Uma solução comum é comentar as diretivas, para que você saiba facilmente a que se referem:
fonte
Em quase todos os compiladores C / CPP disponíveis atualmente, ele não é restrito. Cabe ao usuário decidir como deseja alinhar o código. Tão feliz com codificação.
fonte