Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are the valid characters for macro names?

Are C-style macro names subject to the same naming rules as identifiers? After a compiler upgrade, it is now emitting this warning for a legacy application:

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

This line of code is defining an ASCII value constant for an ampersand.

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

I assume that this definition (not actually referenced by any code, as far as I can tell) is buggy and should be changed to something like "CHAR_AMPERSAND"?

like image 364
An̲̳̳drew Avatar asked Dec 15 '08 19:12

An̲̳̳drew


People also ask

Can macro names be 255 characters?

Names must start with a letter. Names may contain letters, digits and underscores. Names can be at most 255 characters long.

What are two types of characters that can be included in a macro name?

Macro names must begin with a letter and use either letters or numerals. You cannot use spaces, non-alphanumeric characters, or periods.

Can macros have special characters?

Special characters in macrosTo specify a literal number sign in a macro, use a caret ( ^ ) to escape it, as in ^# . A dollar sign ( $ ) specifies a macro invocation. To specify a literal $ , use $$ . To extend a definition to a new line, end the line with a backslash ( \ ).


2 Answers

Macro names should only consist of alphanumeric characters and underscores, i.e. 'a-z', 'A-Z', '0-9', and '_', and the first character should not be a digit. Some preprocessors also permit the dollar sign character '$', but you shouldn't use it; unfortunately I can't quote the C standard since I don't have a copy of it.

From the GCC documentation:

Preprocessing tokens fall into five broad classes: identifiers, preprocessing numbers, string literals, punctuators, and other. An identifier is the same as an identifier in C: any sequence of letters, digits, or underscores, which begins with a letter or underscore. Keywords of C have no significance to the preprocessor; they are ordinary identifiers. You can define a macro whose name is a keyword, for instance. The only identifier which can be considered a preprocessing keyword is defined. See Defined.

This is mostly true of other languages which use the C preprocessor. However, a few of the keywords of C++ are significant even in the preprocessor. See C++ Named Operators.

In the 1999 C standard, identifiers may contain letters which are not part of the “basic source character set”, at the implementation's discretion (such as accented Latin letters, Greek letters, or Chinese ideograms). This may be done with an extended character set, or the '\u' and '\U' escape sequences. The implementation of this feature in GCC is experimental; such characters are only accepted in the '\u' and '\U' forms and only if -fextended-identifiers is used.

As an extension, GCC treats '$' as a letter. This is for compatibility with some systems, such as VMS, where '$' is commonly used in system-defined function and object names. '$' is not a letter in strictly conforming mode, or if you specify the -$ option. See Invocation.

like image 198
Adam Rosenfield Avatar answered Sep 22 '22 18:09

Adam Rosenfield


clang allows a lot of "crazy" characters.. although I have struggled to find any much rhyme or reason - as to why some are allowed, and others are not. For example..

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

yet

#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. 

Who knows. I'd love to... but Google has thus failed me, so far. Any insight on the subject, would be appreciated™️.

like image 33
Alex Gray Avatar answered Sep 24 '22 18:09

Alex Gray