Cで次のようなものを持つことは可能ですか:
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
それらは共存できますか?
Cで次のようなものを持つことは可能ですか:
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
それらは共存できますか?
C 標準は次のように述べています (ISO/IEC 9899:1999、§6.10.3、2)。
オブジェクトのようなマクロとして現在定義されている識別子は、2 番目の定義がオブジェクトのようなマクロ定義であり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。同様に、関数のようなマクロとして現在定義されている識別子は、2 番目の定義が同じ数とパラメーターのスペルを持つ関数のようなマクロ定義であり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。 .
したがって、答えはノーです。
いいえ。関数のような(argsを使用する)マクロとオブジェクトのようなマクロ(argsを使用しない)を同じ名前で定義することはできません(標準では、そうしようとすると、shall notルールに違反します。つまり、コンパイラは診断する必要があります。それ)。ただし、C99は可変個引数マクロ(1つ以上の引数を取る)を指定します。多分それはあなたが望むことをするでしょう?
#undef MACRO_EX
問題が解決した場合は、自由に引数を使用して再定義できます。ただし、argsの有無にかかわらずのみ使用できます。
warning: "MACRO_EX" redefined [enabled by default]
このプログラムでは、
#include <stdio.h>
#include <stdlib.h>
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
int main()
{
printf("\n %d %d\n", MACRO_EX, MACRO_EX(10,20));
printf("\n %d %d\n", MACRO_EX);
return 0;
}
私は得ています
warning: "MACRO_EX" redefined [enabled by default]
note: this is the location of the previous definition
In function ‘main’:
error: ‘MACRO_EX’ undeclared (first use in this function)
note: each undeclared identifier is reported only once for each function it appears in
error: expected ‘)’ before ‘:’ token
1つのマクロとその使用法にコメントすると、正常に機能します:)
しかし、C99 Std によると
6.10.3
現在マクロとして定義されている識別子object-like
は、2 番目の定義がオブジェクトのようなマクロ定義であり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。同様に、現在マクロとして定義されている識別子function-like
は、2 番目の定義が関数のようなマクロ定義であり、パラメーターの数とスペルが同じであり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。
-std=c99
同じエラーが発生する状態でコンパイルして、同じコードを試しました。
見る
#include<stdio.h>
#define MACRO_EX 333
#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))
int main()
{
printf("valud is %d",MACRO_EX);
return 0;
}
エラー
Line 0: warning: "MACRO_EX" redefined
Line 0: warning: this is the location of the previous definition
In function 'main':
Line 10: error: 'MACRO_EX' undeclared (first use in this function)
Line 10: error: (Each undeclared identifier is reported only once
Line 10: error: for each function it appears in.)