2015-10-22 17 views
7

printf%変換指定子には、char配列へのポインタが必要です。 constの欠如に注意してください。私はこれをC言語の理由で見ることができます.C++にはC99標準が組み込まれているので、これは変わりません。私は、このようなANので、未定義の動作について尋ねていないよ。私はprintf自分を書いている場合は、私は無事printf%s const char *

case 's' : 
    ptr = va_arg(va, const char*); 
    _puts(ptr, strlen(ptr)); 
    break; 

この意図しないセマンティクス(ノートを持っているでしょう?:代わりにconst char*に引数を変換することができます実装はとにかく適合しないでしょうか?)

+1

なぜ地球上では省略記号printfがC++で必要なのです11 ???? – SergeyA

+3

直接質問に答えると、何の効果もありません。 va_argはマクロであり、提供したタイプをそのまま使用します。 – SergeyA

+0

const以外の変数を使用して、 'char const *'で関数を呼び出すことができます。だからあなたの関数で 'char const *'型を使うことをお勧めします。 –

答えて

1

C標準(ISO/IEC 9899:2011(E))が7.21.6.1/8で%s変換指定の意味を指定:

ないL長修飾子が存在しない場合、引数は条文字型の配列の最初の要素へのポインタです。

文字タイプがconstまたは非constであるかどうかを伝えるには十分明確に特有のものではない。この製剤。 char,signed char、またはunsigned charが使用されているかどうかは示されません。私は文字配列がC標準の用語として定義されているとは思わない。

入れ替え:%sで指定されたタイプのchar const*を使用すると、変換指定子は問題ありません。

+0

また、標準では 'char *'と 'const char * 'が同じサイズと表現を持つことを指定しているので、' va_arg'は引き続き成功します –

関連する問題