printf %s const char*
printf %s const char*
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
。它甚至没有说明是使用char
、signed char
还是unsigned char
。我不认为字符数组在C标准中定义为术语。
换句话说:对于%s
转换说明符指定的类型使用char const*
是可以的。
相关文章:
- 在字符串函数中抛出'char const*'实例后调用的终止
- 双重标准?为什么只有 char* const&a = "bla" 的警告?
- 包括"lvtocon.h",未定义对'operator<<(std::ostream&, char const*)的引用
- 为什么 const char* const & = 可以编译"hello"?
- 将字符串文本常量定义为 char const* 和 wchar const*
- 如何将std::wstring转换为char const[]
- "char const * name() const _WEBSOCKETPP_NOEXCEPT_TOKEN_ {"剂量是什么意思
- 使用提升对字符串进行标记化时,将令牌转换为 char* const* 时失败
- 如何从 std::initializer_list<char const* 构建 std::vector<std::string>>
- 将 std::vector<std::string> 转换为 const char* const*
- 引发"char const*"错误的实例后调用的终止
- 将const char * const参数成员分配给新值
- 从'const char**'到'char* const*'的转换无效
- 从 sub_match<常量字符 *>' 转换为'const char *const &'
- char*const和constchar*之间有什么区别?(重复-需要更多澄清)
- 使用工厂方法时编译器错误:无法转换"const std::p air<char* const
- HEVC 解码器端口 Android 警告:从 'signed char*' 到 'char const* 的转换无效*
- 如何从'char const*'中删除常量
- 'char const *str'作为模板参数
- 为什么不;t strlen(.)应为const char*const str,而不是const char*