Der C Standard sagt (ISO / IEC 9899: 1999 , §6.10.3, 2):
Ein Bezeichner, der momentan als objektartiges Makro definiert ist, darf nicht von einem anderen neu definiert werden # define preprocessing directive, es sei denn, die zweite Definition ist ein objektähnlicher Makro Definition und die zwei Ersatzlisten sind identisch. Ebenso ein Bezeichner derzeit definiert als ein funktionsähnliches Makro, darf nicht durch ein anderes #define neu definiert werden Vorverarbeitungs-Direktive, es sei denn, die zweite Definition ist eine funktionsähnliche Makrodefinition Das hat die gleiche Nummer und Schreibweise der Parameter, und die zwei Ersatzlisten sind identisch.
Also ist die Antwort nein.
Nein. Eine funktionsähnliche (mit args) und ein objektähnliches Makro (keine args) kann nicht mit dem gleichen Namen definiert werden (im Standard würde der Versuch, dies zu tun, gegen eine soll nicht Regel verstoßen, was bedeutet, dass Compiler wird benötigt, um es zu diagnostizieren). C99 spezifiziert jedoch variadische Makros (die 1 oder mehr Argumente annehmen). Vielleicht wird das tun, was Sie wollen?
Sie können #undef MACRO_EX
frei definieren und mit Argumenten neu definieren, wenn das Ihr Problem löst. Aber es kann nur mit oder ohne Argumente verwendet werden.
In diesem Programm
%Vor%Ich bekomme
%Vor%Wenn ich einen Makro & amp; Es funktioniert dann gut :)
Aber gemäß C99 Std
6.10.3
Ein Bezeichner, der derzeit als object-like
-Makro definiert ist, darf nicht durch eine andere # define-Preprocessing-Direktive neu definiert werden, es sei denn, die zweite Definition ist eine objektähnliche Makrodefinition und die beiden Ersatzlisten sind identisch. Ebenso darf ein Bezeichner, der derzeit als function-like
-Makro definiert ist, nicht durch eine andere # define-Preprocessing-Direktive neu definiert werden, es sei denn, die zweite Definition ist eine funktionsähnliche Makrodefinition mit der gleichen Anzahl und Schreibweise von Parametern und den beiden Ersetzungslisten sind identisch.
Ich habe den gleichen Code ausprobiert, indem ich mit -std=c99
immer noch denselben Fehler erhalte.
Tags und Links macros c c-preprocessor