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

时间:2018-09-05 15:33:49

标签: c linux limit

来自APUE

  

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

     

需要两种限制:

     
      
  1. 编译时限制(例如,短整数的最大值是多少?)

  2.   
  3. 运行时限制(例如,文件名中有多少个字节?)

  4.   
     

编译时限制可以在标头中定义,任何程序都可以在编译时包含这些标头。但是运行时限制要求该过程   调用函数以获取限制值。

     

...

     

如果没有特定的运行时限制,请进一步混淆,   在给定系统上有所不同,可以在一个系统中静态定义   。如果未在标题中定义,则   应用程序必须调用三个conf函数之一(   我们将对此进行简要说明),以便在运行时确定其值。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

或者,您可以将功能存在的任何内容视为运行时限制;当然,在某些系统上,它实际上是一个恒定值,但是对于可移植代码,无论如何都需要使用该函数,因此,在某些系统上检查该函数的运行时限制确实很便宜(在该系统上可以使用该函数定义为返回静态值。

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

答案 1 :(得分:2)

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

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

获得最佳行为的唯一方法是进行系统调用以确定当前限制,或调整您的代码,以便它可以处理较长的字符串(如果遇到它们),并在路径太长时正确报告系统错误被传递到较旧的系统。

正如PJ所说的,如果您附加了不同的文件系统,但它们都施加了自己的限制,那么您仍然需要一定的灵活性,您也需要适当地处理这些限制,但是它们通常在整个系统的限制之内。

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

答案 2 :(得分:1)

@Tim不是。假设您有一个可能连接了许多文件设备的系统。其中任何一个都有自己的不同限制。您只能在运行时发现它,因为您不知道将使用什么硬件。