我想知道:在任何普通的C(不是C ++)实现中,字符串是否被定义为关键字或typedef名称?
含义:要么实现有一个string
关键字,要么它具有一个内置标头,其行类似于:
typedef char* string;
答案 0 :(得分:5)
没有C标准将string
作为关键字。有些人有写作的想法
typedef char* string;
由于混淆而被重新理解。
根据情况使用char*
,const char*
,char[]
或const char[]
来建模NUL
限定的字符串。还有其他建模文本的方法,但这是C标准库使用的方法。
答案 1 :(得分:5)
某些实现可能提供了string
,但这样做却违反了ISO标准的明确要求,因此您可能会认为它们不是 C实现。这是因为,在C11 7.31 Future library directions
中,它明确指出:
可以添加以
str
,mem
或wcs
开头的函数名以及小写字母<string.h>
标头中的声明。
在更早的7.1.3 Reserved Identifiers
中,我们看到了(我的重点):
在以下任何子条款(包括将来的图书馆指南)和errno
中,具有外部链接的所有标识符始终为 保留用作具有外部链接的标识符
因此实现不应该这样做。当然,您可以在自己的自己代码中自由创建名为string
的东西,您只需要了解这些问题即可。如果您重视便携性,则应该不定义符合此条件的任何内容。否则,将来的C标准可能会使您的代码不可编译。
答案 2 :(得分:4)
不,C实现不提供string
关键字,实际上,它们不能。正如C99所说的(4.符合性):
- [...]符合标准的实现可能具有扩展(包括其他 库函数),前提是它们不会更改任何严格符合的行为 程序。 3)
3)这意味着符合标准的实现除了本国际标准中明确保留的标识符外,不保留其他标识符。
C99定义的关键字完全是:
auto enum restrict unsigned
break extern return void
case float short volatile
char for signed while
const goto sizeof _Bool
continue if static _Complex
default inline struct _Imaginary
do int switch
double long typedef
else register union
string
不在该列表中。
该标准的稍后部分定义了哪些标识符保留供实现使用:
- 所有以下划线开头,大写字母或另一个下划线开头的标识符始终保留用于任何用途。
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中文件范围的标识符。
如果实现要提供其他关键字,则必须为__string
或_String
之类。
在 7.26将来的图书馆说明下,
7.26.11字符串处理
<string.h>
- 以
str
,mem
或wcs
开头的函数名以及小写字母可以添加到<string.h>
标头中的声明中。
因此,实现的“最佳”方法是将string
定义为一个函数,并且仅在包含<string.h>
的情况下。