printf %s const char*

printf %s const char*

本文关键字:char const printf      更新时间:2023-10-16

printf%转换指示符需要指向char数组的指针。注意缺少const。我可以在C中看到这样做的原因,而且由于c++包含了C99标准,这一点不会改变。但是,如果我正在编写自己的printf,我可以安全地将参数转换为const char*吗?:

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

这会有任何意想不到的语义(注意:我不是在问未定义的行为,因为这样的实现无论如何都不符合)?

C标准(ISO/IEC 9899:2011 (E))规定了7.21.6.1/8中%s转换说明符的含义:

如果没有长度修饰符,则实参必须是指向字符类型数组初始元素的指针。

这个表述显然不够具体,无法判断字符类型是const还是非const。它甚至没有说明是使用charsigned char还是unsigned char。我不认为字符数组在C标准中定义为术语。

换句话说:对于%s转换说明符指定的类型使用char const*是可以的。