In C99 haben wir zusammengesetzte Literale, und sie können an Funktionen übergeben werden wie in:
%Vor% Wenn jedoch f
keine Funktion ist, sondern ein funktionsähnliches Makro, dann garkiert gcc das, weil der Präprozessor es nicht als ein Argument analysiert, sondern als zwei Argumente, " (int[2]){ 1
" und " 2 }
".
Ist das ein Fehler in gcc oder im C-Standard? Wenn es das Letztere ist, schließt das so ziemlich alle transparente Verwendung von funktionsähnlichen Makros aus, was wie ein riesiger Defekt aussieht ...
Bearbeiten: Als ein Beispiel würde man erwarten, dass das folgende ein konformes Programmfragment ist:
%Vor% Aber da fgetc
als Makro implementiert werden könnte (obwohl es erforderlich ist, um sein Argument zu schützen und es nicht mehr als einmal auszuwerten), wäre dieser Code tatsächlich falsch. Das erscheint mir überraschend.
Dieser "Fehler" existiert seit C89 im Standard:
%Vor% Ich habe den Standard noch nicht durchgesehen, um dieses Parsing zu überprüfen. Ich habe Gcc's Wort dafür genommen, aber informell die Notwendigkeit eines übereinstimmenden :
zu jedem ?
übertrumpft sowohl den Operator-Vorrang als auch die Argumentlisten-Syntax mache die erste Aussage funktionieren. Kein Glück mit dem zweiten.
Dies ist nach dem C-Standard, ähnlich wie in C ++, ist das Folgende ein Problem:
%Vor%Wenn in C99 einige zusätzliche Klammern hinzugefügt werden sollen, können Sie Folgendes verwenden:
%Vor%Die Regel, die dieses Verhalten aus C99 §6.10.3 / 11 spezifiziert, lautet wie folgt:
Die Reihenfolge der Vorverarbeitungstoken, die von den äußersten passenden Klammern begrenzt werden bildet die Liste der Argumente für das funktionsähnliche Makro.
Die einzelnen Argumente in der Liste werden durch Kommavorverarbeitungstoken getrennt, aber Kommavorverarbeitungstoken zwischen übereinstimmenden inneren Klammern trennen keine Argumente.
Soweit es ein Fehler überhaupt ist, ist es mit dem Standard, nicht gcc (d. h. in dieser Hinsicht glaube ich, gcc tut, was der Standard erfordert).
Tags und Links c gcc c99 c-preprocessor compound-literals