运行时限制和编译时间限制的定义是什么?

问题描述 投票:-2回答:3

来自APUE

其中许多已被硬编码到程序中或使用特殊技术确定。通过我们描述的各种标准化工作,现在提供了更多可移植方法来确定这些神奇数字和实现定义的限制,从而大大提高了为UNIX环境编写的软件的可移植性。

需要两种类型的限制:

  1. 编译时限制(例如,短整数的最大值是多少?)
  2. 运行时限制(例如,文件名中有多少字节?)

编译时限制可以在任何程序可以在编译时包含的标头中定义。但运行时限制要求进程调用函数以获取限制的值。

...

为了进一步混淆,如果给定系统上的特定运行时限制没有变化,可以在标题中静态定义。但是,如果它没有在头文件中定义,则应用程序必须调用三个conf函数之一(我们将在稍后描述)来确定其在运行时的值。

首先,在我看来,编译时限制被定义为可以在头文件中定义的编译时限制,运行时限制被定义为不能编译的限制。

然后在我看来,也可以在标题中定义运行时限制。

那么运行时限制和编译时间限制的定义是什么?

c linux limit
3个回答
2
投票

您的原始定义已经正确。如果您能够使用标头中的准确限制,则意味着对于该系统,它是编译时限制。它可能是某些其他系统的运行时限制,在这种情况下,标头不会提供静态定义。

或者,您可以考虑函数作为运行时限制存在的任何内容;当然,它在某些系统上实际上是一个常量值,但是对于可移植代码,你仍然需要使用该函数,所以这是一个运行时限制,恰好在某些系统上检查是非常便宜的(函数可以在哪里)定义为返回静态值)。

重点是,没有一个确切的答案;有些东西是有条件的运行时或编译时取决于系统,有些东西总是编译时,有些东西总是运行时。这是一个维恩图。


2
投票

运行时限制(例如完整路径名)很可能取决于操作系统的版本。

如果您希望程序能够在具有较短路径名称限制(例如128个字符)的旧系统上运行,则您不希望它在具有更大限制(例如4096)字符的较新系统上进行人为限制。

获得最佳行为的唯一方法是进行系统调用以确定当前限制,或者调整代码以便在遇到代码时能够处理更长的字符串,并在传递太长的路径时正确报告系统错误旧系统。

正如PJ所说,如果你有不同的文件系统,你需要一些灵活性,你需要优雅地处理它们自己的限制,但它们通常在整个系统强加的限制范围内。

在某种程度上,如果您使用具有动态字符串长度等级的高级语言,则不受这些运行时限制的限制,但了解它们确实存在很有用。


1
投票

@Tim没有。想象一下,您的系统可能附加了许多文件设备。任何这些都可能有不同的限制。它只能作为编译时发现运行时,你不知道将使用什么硬件。

© www.soinside.com 2019 - 2024. All rights reserved.