8

Cで次のようなものを持つことは可能ですか:

#define MACRO_EX 333

#define MACRO_EX(X,Y) ((X) < (Y) ? : (X) : (Y))

それらは共存できますか?

4

4 に答える 4

5

C 標準は次のように述べています (ISO/IEC 9899:1999、§6.10.3、2)。

オブジェクトのようなマクロとして現在定義されている識別子は、2 番目の定義がオブジェクトのようなマクロ定義であり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。同様に、関数のようなマクロとして現在定義されている識別子は、2 番目の定義が同じ数とパラメーターのスペルを持つ関数のようなマクロ定義であり、2 つの置換リストが同一でない限り、別の #define 前処理ディレクティブによって再定義されません。 .

したがって、答えはノーです。

于 2012-09-25T09:57:21.393 に答える
3

いいえ。関数のような(argsを使用する)マクロとオブジェクトのようなマクロ(argsを使用しない)を同じ名前で定義することはできません(標準では、そうしようとすると、shall notルールに違反します。つまり、コンパイラは診断する必要があります。それ)。ただし、C99は可変個引数マクロ(1つ以上の引数を取る)を指定します。多分それはあなたが望むことをするでしょう?

#undef MACRO_EX問題が解決した場合は、自由に引数を使用して再定義できます。ただし、argsの有無にかかわらずのみ使用できます。

于 2012-09-25T09:34:57.353 に答える
1
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同じエラーが発生する状態でコンパイルして、同じコードを試しました。

于 2012-09-25T09:31:43.383 に答える
0

見る

http://codepad.org/0nfvOGTl

#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.)
于 2012-09-25T09:37:59.637 に答える