From: Keith.S.Thompson+u@gmail.com   
      
   Tim Rentsch writes:   
   > James Kuyper writes:   
   [...]   
   >> Note: in C2023, the [predefined macro names] section says: "Any other   
   >> predefined macro names: shall begin with a leading underscore   
   >> followed by an uppercase letter; or, a second underscore...". For   
   >> earlier versions of the standard, user code should avoid using such   
   >> identifiers because they were reserved for all purposes, but that's no   
   >> longer the case. Now, they should be avoided because they may be   
   >> pre-defined by the implementation, which means that any attempt to use   
   >> them might have unpredictable results.   
   >   
   > That's right in the sense that if the implementation is unknown then   
   > unexpected results may occur. However, if the implementation is   
   > known, then we can find out what results are expected by consulting   
   > the implementation's documentation for extensions, since any such   
   > macro name must qualify as an extension, and so much be documented.   
   >   
   > Note by the way that the description in N3220 section 6.10.10.1   
   > paragraph 2 makes using #define or #undef be undefined behavior only   
   > for macro names in the subclause (and also a short list of other   
   > identifiers). Hence any other predefined macro name may be used,   
   > definedly, simply by using #undef and then #define for the macro   
   > name in question (in particular, under C23 rules, but not earlier   
   > versions of the C standard).   
      
   I don't *think* that all implementation-specific predefined macros have   
   to be documented -- at least, I'd be surprised if that were the intent.   
      
   For example, I don't think an implementation is required to document its   
   use of _STDIO_H (the include guard header in the glibc implementation of   
   ).   
      
   Though it's not normative, N3220 J.5.1 (Common extensions) says:   
      
    Examples of such extensions are new keywords, extra library   
    functions declared in standard headers, or predefined macros with   
    names that do not begin with an underscore.   
      
   --   
   Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.com   
   void Void(void) { Void(); } /* The recursive call of the void */   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   
|