ANSI C oder nicht



  • Hallo zusammen
    Ich verwende eine Bibliothek darin ist Code in folgendem Stil

    #define MACRO(arg)	(arg);
    
    int func(void)
    {
      return MACRO( 1000U
                  + 200U
    #if defined(NDEBUG)
                  + 30U
    #endif
                  + 4U)
    }
    

    GCC kann dies übersetzten.



  • Aha



  • Sorry zu schnell veröffentlich (CTRL+Enter)

    1. Versuch
      Hallo zusammen
      Ich verwende eine Bibliothek darin ist Code in folgendem Stil
    #define MACRO(arg)	(arg)
    
    int func(void)
    {
      return MACRO( 1000U
                  + 200U
    #if defined(NDEBUG)
                  + 30U
    #endif
                  + 4U);
    }
    

    GCC kann dies übersetzten.
    Visual C meldet einen Syntax Fehler.

    Der Hersteller sagt die Bibliothek ist ANSI C konform.
    Ich weis, der Preprocessor lässt in der Norm einiges an Spielraum.
    Kann jemand bestätigen oder wiederlegen, ob dies ANSI C konform ist?

    Danke

    Reto Felix



  • @ReFe

    Visual C meldet einen Syntax Fehler.

    Es ist dir aber zu mühsam näheres zu sagen?



  • Hallo
    Visual C meldet
    error C2121: "#": ungültiges Zeichen: möglicherweise das Ergebnis einer Makroerweiterung
    error C2059: Syntaxfehler: "if"

    Ich bin der Meinung, da bedingte Übersetzung darf nicht innerhalb Makros oder Makroargumente verwendet werden.


  • Mod

    @ReFe sagte in ANSI C oder nicht:

    Ich bin der Meinung, da bedingte Übersetzung darf nicht innerhalb Makros oder Makroargumente verwendet werden.

    Jain. Das Verhalten ist undefiniert.

    PS: Im C11-Standard geht das recht eindeutig aus §6.10.3,11 hervor:

    The sequence of preprocessing tokens bounded by the outside-most matching parentheses forms the list of arguments for the function-like macro. The individual arguments withinthe list are separated by comma preprocessing tokens, but comma preprocessing tokens between matching inner parentheses do not separate arguments. If there are sequences of preprocessing tokens within the list of arguments that would otherwise act as preprocessing directives, the behavior is undefined.



  • @SeppJ sagte in ANSI C oder nicht:

    The sequence of preprocessing ...

    Danke für die Info
    Ich werde dies mal dem Bibliotheken Hersteller weiterleiten.



  • Wenn du deinen Code mit gcc -pedantic kompilierst, bekommst du:

    #1 with x86-64 gcc 9.2
    <source>: In function 'func':
    
    <source>:7:1: warning: embedding a directive within macro arguments is not portable
    
        7 | #if defined(NDEBUG)
    
          | ^
    
    <source>:9:1: warning: embedding a directive within macro arguments is not portable
    
        9 | #endif
    
          | ^
    
    Compiler returned: 0
    

Anmelden zum Antworten