Pergunta

Eu tenho o código fonte de um aplicativo escrito em C ++ e eu só quero comentar algo usando:

#ifdef 0
...
#endif

E eu recebo este erro

erro: macro nomes devem ser identificadores

Por que isso está acontecendo?

Foi útil?

Solução

A directiva #ifdef é usado para verificar se um símbolo de pré-processamento é definida Os padrão (C11 6.4.2 Identifiers) mandatos que os identificadores não devem começar com um dígito:.

identifier:
    identifier-nondigit
    identifier identifier-nondigit
    identifier digit
identifier-nondigit:
    nondigit
    universal-character-name
    other implementation-defined characters>
nondigit: one of
    _ a b c d e f g h i j k l m
    n o p q r s t u v w x y z
    A B C D E F G H I J K L M
    N O P Q R S T U V W X Y Z
digit: one of
    0 1 2 3 4 5 6 7 8 9

A forma correcta para a utilização do pré-processador para bloquear o código é:

#if 0
: : :
#endif

Você também pode usar:

#ifdef NO_CHANCE_THAT_THIS_SYMBOL_WILL_EVER_EXIST
: : :
#endif

mas você precisa ter certeza de que os símbolos serão não ser inadvertidamente definido pelo código diferente do seu. Em outras palavras, não use algo como NOTUSED ou DONOTCOMPILE que outros também podem usar. Para ser seguro, a opção #if deve ser preferida.

Outras dicas

Use o seguinte para avaliar uma expressão (constante 0 é avaliado como false).

#if 0
 ...
#endif

Este erro também pode ocorrer se você não está seguindo as regras marco

Como

#define 1K 1024 // Macro rules must be identifiers error occurs

Motivo: macro deve começar com uma letra, não um número

Mude para

#define ONE_KILOBYTE 1024 // This resolves 
#ifdef 0
...
#endif

#ifdef esperar uma macro em vez de expressão quando se utiliza constante ou expressão

#if 0
...
#endif

ou

#if !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

Se #ifdef é usado a ele relata esse erro

#ifdef !defined(PP_CHECK) || defined(PP_CHECK_OTHER)
..
#endif

Onde #ifdef esperar uma macro em vez de expresssion macro

Note que você também pode bater este erro se você digitar acidentalmente:

#define <stdio.h>

... em vez de ...

#include <stdio.>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top