2012-03-13 10 views
8

のVisual C++ 10は、とりわけこの宝石が含まれていSTDLIB.Hが同梱されています:a clever template trick to deduce array size__countofに渡されるのポインタを防ぐ使用この「要素数」マクロのダミー加算の目的は何ですか?

template <typename _CountofType, size_t _SizeOfArray> 
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray]; 

#define _countof(_Array) (sizeof(*__countof_helper(_Array)) + 0) 

+ 0のマクロ定義の目的は何ですか?どのような問題が解決しますか?

+0

[PSコメントとしてこれを考慮してください]私が考えることができるのは、それをテンプレートの特殊化で使用できないようにすることだけです。しかしそれは限界だ。 – Pubby

+0

もちろん、VS2010が 'constexpr'をサポートしていれば、' template constexpr size_t size(T(&)[N]){return N; } ' –

答えて

14

here

からSTLを引用私はこの変更を行いました。私は通常、CRTをハックしませんが、これは です。 + 0は誤った "警告C6260:sizeof * sizeof は通常間違っています。文字数またはバイト数 を使用しましたか?"誰かが_countof(arr)* sizeof(T)を書くときから/分析する。

2

マクロ定義で+0の目的は何ですか? はどんな問題を解決しますか?

私はそれが問題を解決するとは思わない。これは、別の答えに記載されているように、ある警告を黙らせるために使用されるかもしれません。重要なノートで、次はコンパイル時(個人的に私はそれがより読みやすい見つける。)で、配列のサイズを見つける別の方法

されています:

template<unsigned int SIZE> 
struct __Array { char a[SIZE]; } 

template<typename T, unsigned int SIZE> 
__Array<SIZE> __countof_helper(const T (&)[SIZE]); 

#define _countof(_Array) (sizeof(__countof_helper(_Array))) 

+0

不正な識別子の名前...不正な識別子の名前! – Xeo

+0

@Xeo、これは既にライブラリコード(OP)に使用されていて、既に '__'と' _'の後に大文字が含まれていると仮定しています。質問のソースからコピーされます。 – iammilind

+0

@ iammilind:私はこれもより読みやすいと思っていますが、VS方法についての良いことは、偽の 'struct'を導入することを避けることです。 –

関連する問題