为什么C字符串文字的最大长度与max char []不同?

npo*_*avs 16 c standards

澄清:鉴于字符串文字可以重写为const char[](见下文),在文字上施加的最大长度低于 char[]s,这只是语法上的不便.为什么C标准鼓励这个?


C89标准对字符串文字有翻译限制:

字符串文字或宽字符串文字中的509个字符(连接后)

char数组没有限制; 也许

对象中的32767个字节(仅限托管环境中)

适用(我不确定什么对象或托管环境的意思),但无论如何它是一个更高的限制.

我的理解是字符串文字等同于包含字符的char数组,即:它总是可以重写这样的东西:

const char* str = "foo";
Run Code Online (Sandbox Code Playgroud)

进入这个

static const char __THE_LITERAL[] = { 'f', 'o', 'o', '\0' };
const char* str = __THE_LITERAL;
Run Code Online (Sandbox Code Playgroud)

那么为什么文字如此严格限制呢?

Kei*_*son 22

字符串文字的限制是编译时要求; 对逻辑源行的长度有类似的限制.编译器可能使用固定大小的数据结构来保存源行和字符串文字.

(C99将这些特定限制从509个字符增加到4095个字符.)

另一方面,char可以在运行时构建对象(例如数组).限制可能是由目标机器架构强加的,而不是由编译器的设计强加的.

请注意,这些不是对程序施加的上限.编译器不需要施加任何有限的限制.如果编译器对行长度施加限制,则它必须至少为509或4095个字符.(我认为,大多数实际编译器都不会施加固定限制;而是动态分配内存.)


Ric*_*III 5

这并不是说509个字符是一个字符串的限制,它是ANSI兼容所需的最低限度,为解释在这里

我认为该标准的制定者将509号从他们的屁股上拉了出来,但是除非我们从中获得一些官方文件,否则我们无从得知。

字符串文字中实际上可以有多少个字符,这取决于编译器。

这里有些例子:

  • MSVC:2048
  • GCC:无限制(最多100,000个字符),但在510个字符后发出警告:

    长度为100000的字符串文字超出了C90编译器需要支持的最大长度509

  • @ RichardJ.RossIII,关于您对509的来源的评论:我不认为这是来自某人的屁股。这是509个字符,为一个字节的字符串结尾字符(\\ 0)和一个两个字节的指针留出了空间。至少,这是我的猜测。 (4认同)
  • 我认为关键是标准中引用的 509 是最小值,而不是最大值。 (2认同)