是否有一些C实现定义了string关键字?

时间:2018-09-17 07:46:53

标签: c string

我想知道:在任何普通的C(不是C ++)实现中,字符串是否被定义为关键字或typedef名称?

含义:要么实现有一个string关键字,要么它具有一个内置标头,其行类似于:

typedef char* string;

3 个答案:

答案 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中,它明确指出:

  

可以添加以strmemwcs开头的函数名以及小写字母   <string.h>标头中的声明。

在更早的7.1.3 Reserved Identifiers中,我们看到了(我的重点):

  在以下任何子条款(包括将来的图书馆指南)errno中,具有外部链接的

所有标识符始终为 保留用作具有外部链接的标识符

因此实现不应该这样做。当然,您可以在自己的自己代码中自由创建名为string的东西,您只需要了解这些问题即可。如果您重视便携性,则应该定义符合此条件的任何内容。否则,将来的C标准可能会使您的代码不可编译。

答案 2 :(得分:4)

不,C实现不提供string关键字,实际上,它们不能。正如C99所说的(4.符合性):

  
      
  1. [...]符合标准的实现可能具有扩展(包括其他   库函数),前提是它们不会更改任何严格符合的行为   程序。 3)
  2.   
     

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>

     
      
  1. strmemwcs开头的函数名以及小写字母可以添加到<string.h>标头中的声明中。
  2.   

因此,实现的“最佳”方法是将string定义为一个函数,并且仅在包含<string.h>的情况下。