2015-10-22 21 views
7

printf Lo standard di conversione % prevede un puntatore a un array char. Notare la mancanza di const. Posso vedere le ragioni di ciò in C, e poiché C++ incorpora lo standard C99, questo non cambierebbe. Tuttavia, se sto scrivendo il mio printf, posso tranquillamente convertire l'argomento const char* invece ?:printf% s const char *

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

Sarebbe questo avere la semantica non intenzionali (nota: Non sto chiedendo su un comportamento indefinito, perché un tale l'implementazione non sarebbe comunque conforme)?

+1

perché mai hai bisogno di puntini di sospensione in C++ 11 ???? – SergeyA

+3

Rispondendo alla domanda diretta, non avrà alcun effetto. va_arg è una macro e utilizzerà semplicemente qualunque tipo tu abbia fornito. – SergeyA

+0

È possibile chiamare una funzione con 'char const *' utilizzando una variabile non const. Quindi ti consiglio di usare il tipo 'char const *' nella tua funzione. –

risposta

1

Lo standard C (ISO/IEC 9899: 2011 (E)) indica il significato del specificatore %s conversione in 7.21.6.1/8:

Se nessun modificatore l lunghezza è presente, l'argomento deve essere un puntatore all'elemento iniziale di un array di tipo di carattere.

Questa formulazione chiaramente non abbastanza specifico per dire se il tipo di carattere è const o non const. Non viene nemmeno indicato se viene utilizzato char, signed char o unsigned char. Non credo che l'array di caratteri sia definito come un termine nello standard C.

Inserire in modo diverso: utilizzando char const* per il tipo specificato da un identificatore di conversione %s va bene.

+0

Rilevante è che lo standard specifica che 'char *' e 'const char *' hanno la stessa dimensione e rappresentazione ecc., Quindi il 'va_arg' riesce ancora –

Problemi correlati