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.