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
仍然成功