什么是运行时约束?

What is a runtime-constraint?

我多次听说过 "runtime-constraint" 这个词。我一直在实际标准 ISO/IEC 9899:2018 (C18) 中寻找术语 "runtime-constraint",但我找到的只是:

来源:ISO/IEC 9899:2018 (C18),第 3.18 节:

3.18

1 runtime-constraint

requirement on a program when calling a library function.

我不明白,这句话要表达什么。哪个要求?我比以前明白了。

"requirement" 本身在这里没有任何描述。只是强调,调用库函数时引用的要求应该是存在的,而不是这个要求到底是什么。

这里的 "program" 到底是什么意思?

这是否意味着运行时约束是对可执行文件的要求如何调用库函数?但是为什么可执行文件要调用一个库函数呢?我的观点是可执行文件只是机器代码,需要执行。


这是在运行时对非法值或缺失值进行的检查 - 实际的约束检查取决于所调用的特定库函数。例如,

K.3.5.1.1 The tmpfile_s function

Synopsis

1 #define _ _STDC_WANT_LIB_EXT1_ _ 1 #include <stdio.h> errno_t tmpfile_s(FILE * restrict * restrict streamptr);

Runtime-constraints

2 streamptr shall not be a null pointer.

IOW,如果您将 NULL 传递给 streamptr,那将违反运行时约束,这会导致调用约束处理函数(您可以编写自己的约束处理函数)。如果这有助于形象化的话,它有点像但不是真正的异常处理程序。

每个库函数都定义了自己的要求,因此每个函数都有自己的运行时约束检查。

编辑

正如 Jonathan Leffler 在评论中指出的那样,运行时约束仅适用于附件 K 中指定的边界检查库函数,并且这些库函数是可选的——并非每个实现都支持它们。事实上,C 标准委员会文件 n1967 表明没有实现完全支持它们,C11 和 C18 附件 K 中指定的功能可能会从 C 标准的未来版本中删除。