4

Linuxカーネルでマクロの定義を調べたところ、container_of複合ステートメントがマクロ定義であることがわかりました。

#define container_of(ptr, type, member) ({                      \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})

しかし、私の頭の中の不明確な問題は、どのステートメントが右辺値として考慮されるかということです。どうやら最後のステートメントの結果が右辺値として使用されていますが、なぜですか?

(type *)( (char *)__mptr - offsetof(type,member) );

たとえば、以下のコード例はCで合法ですか?

int g_count = 0xFF;

#define GLOBAL_COUNT do {g_count;} while(0)

int main(int argc, char *argv[])
{
    int local;
    local = GLOBAL_COUNT;
    local = 0;
    GLOBAL_COUNT = local;
    return 0;
}

複合ステートメントの変数の割り当てルールは何ですか?

4

2 に答える 2

8

({})ステートメント式と呼ばれるCのGNU拡張です:

http://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html

Cでは、複合ステートメントはステートメントであり、ステートメントを式で使用することはできません。

于 2013-01-03T21:09:19.273 に答える
4

表示されるのはステートメント式であり、複合ステートメントではありません。ステートメント式は、標準のC言語には存在しないGCC拡張機能です。

GCCステートメントでは、式は結果を「値で」返します。つまり、結果は右辺値です。これは実際にはC言語の一般的な「哲学」と一致しています。Cでは、実質的に左辺値オブジェクトを操作すると、すぐに左辺値が失われ、右辺値に変わります。(この点で、CはC++と実質的に反対です。C++は左辺値を可能な限り維持しようとします。)

于 2013-01-03T21:12:37.097 に答える