C23标准中strchr的QChar*是什么?GCC/Clang是否支持?
疑问:C23中
strchr()的/*QChar*/是什么? cppreference展示了strchr()的如下原型:
char *strchr( const char *str, int ch ); (1) /*QChar*/ *strchr( /*QChar*/ *str, int ch ); (2) (since C23)
并针对第二个版本给出如下解释:
与(1)等效的泛型函数。设T为非限定字符对象类型。
- 若
str为const T*类型,则返回类型为const char*。- 否则,若
str为T*类型,则返回类型为char*。- 其他情况行为未定义。
请问:
- 这个
QChar*是什么?它是一种新类型吗? - 如果是,GCC 和/或 Clang 是否已经支持它?我能否在自己的应用代码中使用它?
回答
1. /*QChar*/的本质
/*QChar*/不是实际存在的新类型,它是cppreference用来占位的注释写法,目的是示意这个位置是泛型字符类型参数。对应C23标准新增的strchr泛型版本,这里的类型可以是任意非限定的字符对象类型(比如unsigned char、signed char等),而非某个叫QChar的具体类型。
2. 编译器支持情况
- GCC:从13版本开始部分支持C23的泛型字符串函数,包括
strchr的泛型版本,编译时需要指定-std=c23或-std=gnu23选项。 - Clang:从16版本开始提供对该特性的支持,同样需要启用
-std=c23或-std=gnu23编译选项。
3. 应用代码中的使用
你完全可以在代码中使用这个C23的泛型版本,但注意:
- 确保编译器版本符合上述要求,且开启C23标准编译选项。
- 使用时直接传入合法的字符类型指针即可(比如
unsigned char*),不需要写QChar这个占位符。 - 必须遵循标准规定:传入的类型必须是非限定的字符对象类型,否则行为未定义。
内容的提问来源于stack exchange,提问作者Madagascar
相关产品推荐
相关产品推荐

