1

私はこれらのいずれかを考えていました:

#if sizeof(size_t) == 8
const size_t foo = 12345;
#elif sizeof(size_t) == 4
const size_t foo = 123;
#else
#error "Unsupported size_t size"
#endif

また

template <int S> class Foo { static const size_t foo = 0; };
template <> class Foo<8> { static const size_t foo = 12345; };
template <> class Foo<4> { static const size_t foo = 123; };
const size_t foo = Foo<sizeof(size_t)>::foo;

また、2 番目の方法を使用してコンパイル時エラーをスローするにはどうすればよいですか?

4

3 に答える 3

4

クラス テンプレートを使用したソリューションは、これを行うための優れた慣用的な方法です (最初の代替案も機能しないため、これら 2 つの候補の間で競合することはありません)。

コンパイル時エラーを引き起こすには、単純にすべてのサイズのテンプレートを定義しないでください:

template <int S> class Foo;

コンパイラは、問題のある の値に対してテンプレートが定義されていないと文句を言いますsizeof(size_t)

Fooまた、名前を次のように変更することも役立ちEnvironment_Where_sizeof_int_isます。実際には、よりすぐに理解できるコンパイラ エラーが発生します。

于 2015-01-24T00:15:48.243 に答える
0

定義された構造体の最初と 2 番目のメンバーの型を使用し、2 番目のメンバーのオフセットを取得して最初のメンバーのサイズを取得します (これは、最初のメンバーと 2 番目のメンバーの間にパディングがないことを前提としており、最初のメンバーは同じアドレスを持つことが保証されています)構造として)。

#define ofs(s,m)   (size_t)&(((s *)0)->m)

typedef struct S_{
size_t a;       /* type to get the size of */
size_t b;       /* make this same type as above */
}S;

int main()
{
size_t c;
    c = ofs(S,b);   /* get size of S.a */
    return(0);
}
于 2015-01-24T01:02:36.927 に答える