C++ printf%s常量字符*

C++ printf%s常量字符*,c++,c++11,C++,C++11,printf的%转换说明符需要指向char数组的指针。注意缺少const。我可以看到C中的原因,因为C++包含了C99标准,这不会改变。但是,如果我正在编写自己的printf,是否可以安全地将参数转换为const char* case 's' : ptr = va_arg(va, const char*); _puts(ptr, strlen(ptr)); break; 这是否会有任何非预期的语义(注意:我不是问未定义的行为,因为这样的实现无论如何都不符合要求)?C标准

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
转换说明符的含义:

如果不存在l长度修饰符,则参数应为指向字符类型数组初始元素的指针

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


换言之:对
%s
转换说明符指定的类型使用
char const*
很好。

在c++11中究竟为什么需要省略号printf???回答直接的问题,它不会有任何效果。va_arg是一个宏,它将简单地使用您提供的任何类型。您可以使用非常量变量调用带有
char const*
的函数。因此,我建议您在函数中使用
char-const*
类型。另外相关的是,标准规定
char*
const-char*
具有相同的大小和表示形式等,因此
va_-arg
仍然成功