validos una son reemplazar que por para nombres macro los especiales eliminar ejemplos dominios cuáles contraseña celda caracteres cambiar c compiler-warnings c-preprocessor

una - ¿Cuáles son los caracteres válidos para los nombres de macro?



nombres de 20 caracteres (4)

Las mismas reglas que especifican 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 AZ, las letras minúsculas az, el guión bajo y los caracteres definidos de implementación.

¿Están los nombres de macro de estilo C sujetos a las mismas reglas de denominación que los identificadores? Después de una actualización del compilador, ahora está emitiendo esta advertencia para una aplicación heredada:

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 está definiendo una constante de valor ASCII para un símbolo comercial.

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

Supongo que esta definición (que en realidad no hace referencia a ningún código, por lo que yo sé) es un error y debería cambiarse a algo así como "CHAR_AMPERSAND".


Los nombres de macro solo deben constar de 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.

De la documentación de GCC :

Los tokens de preprocesamiento se dividen en cinco amplias clases: identificadores, números de preprocesamiento, literales de cadenas, puntuadores y otros. 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 un 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. Se define el único identificador que puede considerarse una palabra clave de preprocesamiento. Ver Definido.

Esto es mayormente cierto para otros lenguajes que usan el preprocesador C. Sin embargo, algunas de las palabras clave de C ++ son significativas incluso en el preprocesador. Ver Operadores Nombrados en C ++.

En el estándar C de 1999, los identificadores pueden contener letras que no forman parte del "conjunto de caracteres fuente básico", a discreción de la implementación (como letras latinas acentuadas, letras griegas o ideogramas chinos). Esto se puede hacer con un conjunto de caracteres extendido o las secuencias de escape ''/u'' y ''/U'' . La implementación de esta característica en GCC es experimental; tales caracteres solo se aceptan en las formas ''/u'' y ''/U'' y solo si se -fextended-identifiers .

Como extensión, GCC trata ''$'' como una letra. Esto es por compatibilidad con algunos sistemas, como VMS, donde ''$'' se usa comúnmente en funciones definidas por el sistema y nombres de objetos. ''$'' no es una letra en el modo estrictamente conforme, o si especifica la opción -$ . Ver Invocación.


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

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


clang permite un montón de personajes "locos" ... aunque he tenido problemas para encontrar cualquier rima o razón, en cuanto a por qué algunos están permitidos y otros 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 ™ ️.