3

Xとして明示的に定義されているにもかかわらず、メンバーのサイズが列挙型自体と異なる理由を誰かが説明できますかLL? (enum e_x)X型と同じサイズであることを確認するために、まったく同じ列挙型のメンバーをキャストする必要があるのは直感に反するようです。

#include <stdio.h>
#include <limits.h>

enum e_x { X = 0LL, M = LLONG_MAX };

int main() {
 printf("%zu %zu %zu %zu\n",
         sizeof X,
         sizeof((enum e_x)X),
         sizeof(enum e_x),
         sizeof(long long));
}

出力:

 4 8 8 8

期待される:

 8 8 8 8

を使用する関数に列挙を渡すときに、どのように対処できますva_argか?

4

3 に答える 3

4

予想される動作は C++ には当てはまりますが、C には当てはまりません。C では非int列挙子は許可されません。N1570 (~C11) §6.7.2.2/2 から:

列挙定数の値を定義する式は、 として表現可能な値を持つ整数定数式でなければなりませんint

パラグラフ 3 には、次のようにも書かれています。

列挙子リスト内の識別子は、型を持つ定数として宣言され、そのintようなことが許可されている場所であればどこにでも表示できます。

パラ 4 は次のように述べています。

各列挙型は、char、符号付き整数型、または符号なし整数型と互換性がある必要があります。タイプの選択は実装定義です

sizeof X == sizeof(int)sizeof M == 4おそらく同じ理由で、パラ3の結果です。実装では、列挙型に 64 ビット整数型が選択されているようsizeof(enum e_x) == 8ですsizeof((enum e_x)X)) == 8

于 2013-07-25T11:34:14.253 に答える
1

あなたの本当の問題は、可変引数を持つ関数に long long 引数を渡すことを扱っているようです:

「va_arg を使用する関数に列挙を渡す場合、どのように対処できますか?」

おそらくできません。C では、可変引数を持つ関数は、処理できる型の種類が制限されています。整数型はデフォルトの引数昇格を受け、ほとんどまたはすべての整数型が int に変更されます。これが私が見つけることができる最高のリファレンスです: http://www.eskimo.com/~scs/cclass/int/sx11c.html

long long を絶対に渡す必要がある場合は、おそらく long long へのポインターを渡すことができます。

于 2013-07-25T11:57:07.370 に答える
0

ISO C では、列挙子の値が の範囲intのみに制限されています。 に収まらない列挙定数がint必要な場合は、コンパイラ固有の拡張機能を使用する必要があります。

さらに重要なことに、コンパイラは、定義した値を表すことができる場合、より小さな型を自由に選択できます。

-pedanticオプションでコンパイルしようとすると、エラーが発生します。

于 2013-07-25T12:22:59.090 に答える