来自APUE
其中许多已硬编码到程序中或已确定 使用临时技术。通过各种标准化工作, 我们已经描述了,现在提供了更多可移植的方法来确定 这些神奇的数字和实施定义的极限 提高为UNIX编写的软件的可移植性 环境。
需要两种限制:
编译时限制(例如,短整数的最大值是多少?)
运行时限制(例如,文件名中有多少个字节?)
编译时限制可以在标头中定义,任何程序都可以在编译时包含这些标头。但是运行时限制要求该过程 调用函数以获取限制值。
...
如果没有特定的运行时限制,请进一步混淆, 在给定系统上有所不同,可以在一个系统中静态定义 。如果未在标题中定义,则 应用程序必须调用三个conf函数之一( 我们将对此进行简要说明),以便在运行时确定其值。
首先,在我看来,编译时限制定义为可以在标头中定义的限制,而运行时限制则定义为不能在标头中定义的限制。
然后在我看来,也可以在标头中定义运行时限制。
那么运行时限制和编译时间限制的定义是什么?
答案 0 :(得分:2)
您的原始定义已经正确。如果您能够使用标头中的准确限制,则意味着对于该系统,这是编译时限制。可能是某些其他系统上的运行时限制,在这种情况下,标头不会提供静态定义。
或者,您可以将功能存在的任何内容视为运行时限制;当然,在某些系统上,它实际上是一个恒定值,但是对于可移植代码,无论如何都需要使用该函数,因此,在某些系统上检查该函数的运行时限制确实很便宜(在该系统上可以使用该函数定义为返回静态值。
要点是,没有一个确切的答案。有些东西是有条件的运行时或取决于系统的编译时,有些东西总是编译时,有些东西总是运行时。这是维恩图。
答案 1 :(得分:2)
运行时限制(例如完整路径名)可能完全取决于操作系统的版本。
如果希望程序能够在具有较短路径名限制(例如128个字符)的旧系统上运行,则不希望它人为地在具有更大限制(例如4096个字符)的新系统上进行限制。 / p>
获得最佳行为的唯一方法是进行系统调用以确定当前限制,或调整您的代码,以便它可以处理较长的字符串(如果遇到它们),并在路径太长时正确报告系统错误被传递到较旧的系统。
正如PJ所说的,如果您附加了不同的文件系统,但它们都施加了自己的限制,那么您仍然需要一定的灵活性,您也需要适当地处理这些限制,但是它们通常在整个系统的限制之内。
在某种程度上,如果您使用具有动态字符串长度等的高级语言,则可以不受这些运行时限制的影响,但是了解它们确实存在是很有用的。
答案 2 :(得分:1)
@Tim不是。假设您有一个可能连接了许多文件设备的系统。其中任何一个都有自己的不同限制。您只能在运行时发现它,因为您不知道将使用什么硬件。