2008-12-15 39 views
36

¿Están los nombres de macro estilo C sujetos a las mismas reglas de denominación que los identificadores? Después de una actualización del compilador, ahora se emite esta advertencia para una aplicación heredada:¿Cuáles son los caracteres válidos para los nombres de macro?

warning #3649-D: white space is required between the macro name "CHAR_" and its replacement text 
    #define   CHAR_&  38 

Esta línea de código es definir una constante para un símbolo de unión valor ASCII.

#define DOL_SN  36 
#define PERCENT  37 
#define CHAR_&  38 
#define RT_SING  39 
#define LF_PAR  40 

que suponer que esta definición (en realidad no referenciado por cualquier código, por lo que yo puedo decir) está libre de errores y debe ser cambiado a algo así como "CHAR_AMPERSAND"?

Respuesta

32

nombres de macro que sólo deben contener caracteres alfanuméricos y guiones bajos, es decir, 'a-z', 'A-Z', '0-9' y '_', y el primer carácter no debe ser un dígito. Algunos preprocesadores también permiten el carácter de signo de dólar '$', pero no debe usarlo; desafortunadamente no puedo citar el estándar C ya que no tengo una copia del mismo.

Desde el GCC documentation:

fichas de preprocesamiento se dividen en cinco grandes clases: identificadores, números de pre-procesamiento, cuerda literales, Signos, y otra. Un identificador es lo mismo que un identificador en C: cualquier secuencia de letras, dígitos o guiones bajos, que comienza con una letra o guión bajo. Las palabras clave de C no tienen importancia para el preprocesador; son identificadores ordinarios . Puede definir una macro cuyo nombre es una palabra clave, por ejemplo. El único identificador que puede ser considerado una palabra clave de preproceso es defined. Ver Definido.

Esto es principalmente válido para otros lenguajes que usan el preprocesador C. Sin embargo, algunas de las palabras clave de C++ son significativas incluso en el preprocesador. Consulte los operadores con nombre de C++.

En el nivel C de 1999, identificadores pueden contener letras que no forman parte del “conjunto de caracteres fuente básica”, a discreción de la aplicación (tales como letras latinas acentuadas, griegos letras o ideogramas chinos) . Este se puede hacer con un juego de caracteres extendidos , o '\u' y '\U' secuencias de escape . La implementación de esta característica en GCC es experimental; tales caracteres solo se aceptan en los formularios '\u' y '\U' y solo si se usa -fextended-identifiers.

Como extensión, GCC trata '$' como una letra . Esto es para compatibilidad con algunos sistemas, como VMS, donde '$' se usa comúnmente en función del sistema nombres de objeto y función.'$' no es una carta en el modo estrictamente conforme, o si especifica la opción -$. Consulte Invocación.

+4

ISO/IEC 9899: TC3 6.10/1 especifica la gramática de las directivas de preprocesamiento, haciendo explícito que los nombres de las macros comparten exactamente las mismas reglas que los identificadores. 6.4.2.1/1 especifica las reglas para los identificadores. – saffsd

6

Tiene razón, las mismas reglas se aplican a macro e identificadores en cuanto a los nombres: los caracteres válidos son [A-Za-z0-9_].

Es un uso común utilizar nombres CAPITALIZED para diferenciar macros de otros identificadores - variables y nombre de la función.

1

Las mismas reglas que especifican los identificadores válidos para los nombres de las variables se aplican a los nombres de macro con la excepción de que las macros pueden tener los mismos nombres que las palabras clave. Los caracteres válidos en los nombres de los identificadores incluyen digits y non-digits y no deben comenzar con un dígito. non-digits incluyen las letras mayúsculas A-Z, las letras minúsculas a-z, el guión bajo y los caracteres definidos de implementación.

+0

"con la excepción de que las macros pueden tener los mismos nombres que las palabras clave", sí, pero también con más excepciones que las macros pueden no tener el mismo nombre que esta palabra clave del preprocesador: –

7

clang permite una gran cantidad de caracteres "locos" .. aunque he tenido problemas para encontrar cualquier mucho orden ni concierto - en cuanto a por qué algunos están permitidos, y otros son no. Por ejemplo ..

#define ?:   /// WORKS FINE 
#define ■ @end  /// WORKS FINE 
#define @interface /// WORKS FINE 
#define P @protocol /// WORKS FINE 

todavía

#define ☎ TEL  /// ERROR: Macro name must be an identifier. 
#define ❌ NO  /// ERROR: Macro name must be an identifier. 
#define ⇧ UP  /// ERROR: Macro name must be an identifier. 
#define 〓 ==  /// ERROR: Macro name must be an identifier. 
#define APPLE /// ERROR: Macro name must be an identifier. 

quién sabe. Me encantaría ... pero Google me ha fallado, hasta ahora. Cualquier idea sobre el tema, sería apreciada ™ ️.

+0

. Consulte la documentación de clang. O si ni siquiera está documentado, verifique su código fuente desde su código abierto. Pero según el estándar C, puedo decir que ninguno de ellos es válido. y por lo tanto, dado que no se le solicita ninguna referencia relacionada con el medio ambiente, sino por el C. sencillo. De modo que esto es aún más apropiado como una Pregunta separada como una respuesta y probablemente incluso debería señalarse como tal. ... Incluso uno bastante bueno. Voy a preguntar esto si no vas a hacerlo. – dhein

+0

@Zaibis consulte [¿Qué constituye el identificador de C "válido"?] (Http://stackoverflow.com/q/34319000/547214) –

Cuestiones relacionadas