はvoid*
常に と同じ表現になりますかchar*
?
詳細:
次のように char* を受け取り、それを a で終了する可変引数関数を操作したいと思います(char*)0
。
int variadic(char*, ...); //<-prototype
variadic("foo", "bar", (char*)0); //<- usage
(char*)0
に置き換えたかったのですNULL
が、http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdfの:
66) マクロ NULL は (およびその他のヘッダー) でヌルポインタ定数として定義されています。7.19 を参照してください。
3 値が 0 の整数定数式、または void * 型にキャストされたそのような式は、ヌル ポインター定数と呼ばれます。66) ヌル ポインター定数をポインター型に変換すると、結果のポインター (ヌル ポインターと呼ばれます) は、どのオブジェクトまたは関数へのポインターとも等しくないことが保証されます。
できません。文脈上variadic
、 が絶対に必要でありchar*
、 plain は0
受け入れられないからです。
次のように定義した場合:
#define NIL (void*)0 /*<= never a plain 0*/
これを使用して解約することは合法でしょうかvariadic(char*,...)
?
ベストアンサー1
C11、§6.2.5、¶28(草案N1570)は言う:
void へのポインターは、文字型へのポインターと同じ表現およびアラインメント要件を持ちます。48) 同様に、互換性のある型の修飾バージョンまたは非修飾バージョンへのポインターには、同じ表現およびアラインメント要件が適用されます。
(強調は私による)。