一次调用printf可以打印的值数量是否有限制?

use*_*123 15 c

printf打印的值的数量是否取决于为特定程序分配的内存,还是可以继续打印值?

chq*_*lie 17

C标准记录了编译器为函数调用接受的最小参数数量:

C11 5.2.4.1翻译限制

该实现应能够翻译和执行至少一个包含以下每个限制的至少一个实例的程序:

  • ...

  • 一个函数调用中有127个参数

  • ...

因此,您应该能够printf在初始格式字符串之后传递至少126个值,假设格式字符串已正确构造并与后面的实际参数一致.

如果格式字符串是字符串文字,则标准保证编译器可以处理至少4095字节长的字符串文字,并且源行至少4095字符长.您可以使用字符串连接在多个源行上拆分文字.如果您使用char数组作为格式字符串,则不存在此类限制.

记录printf功能系列的唯一环境限制是:

任何单次转换可以产生的字符数应至少为4095

这使得格式的行为%10000d最好由实现定义,但标准不强制要求.

因此,兼容的编译器/库组合应该接受至少126个值printf,无论您的环境是否允许更多参数可以由实现定义并记录,但标准不保证.

  • @ user123:对于用户定义的函数,limit是标准定义的行为的下限.如果编写具有更多参数的函数,编译器可能会也可能不会正确处理您的程序并仍然符合该标准. (3认同)
  • @RM:这是一个很好的问题.我一直想知道为什么标准使用这个配方.恕我直言的可变参数函数非常具体,标准应该更加精确,特别是对于类似`printf`的函数.你应该发一个新问题. (3认同)
  • "实施定义"是指标准要求实施来记录行为(见C11 3.4.1) (2认同)
  • @ user123:不,你应该将`printf`调用分成多个调用,每个调用在格式字符串后最多有126个值.具有更多值的单个调用可能与您的环境一样正常工作,但您不应该依赖它. (2认同)