【问题标题】:system () in stdio or stdlib?stdio 或 stdlib 中的 system()?
【发布时间】:2012-01-31 15:47:07
【问题描述】:

我将system("pause")stdio.h 一起使用,它可以正常工作。当我查看 stdio 函数时,system() 在 stdlib 中。它是如何工作的,这是代码?

#include <stdio.h>

int main() {
    printf("Hello World\n" );
    system("pause");
    return 0;
}

【问题讨论】:

  • 听起来像是在欺骗:stackoverflow.com/questions/4800102/…
  • 您必须了解“如果”和“仅当”之间的根本区别。标准文件通常会说:“如果你做 X,你就会得到 Y。”这并没有说明如果你做X会发生什么。
  • 一般情况下最好避免使用系统调用link
    link
    在windows中调用system与运行cmd.exe并输入pause基本相同。
  • @KerrekSB,在 C 中,标头必须仅提供它必须提供的声明和定义(在 C++ 中,标头可以提供更多)。
  • @AProgrammer:非常有趣,谢谢!我想这是有道理的,因为没有名称空间,而且您不想允许使用您没想到的名称进行无声污染。

标签: c stdio std


【解决方案1】:

答案是它是一个隐式声明。如果编译器没有看到函数的原型,则假定它的声明如下:

int system();

如果您在编译器上调高警告级别,您可能会看到这会导致警告。隐式声明通常是不可取的,但在这种情况下,这就是为什么它可以正常工作而不会导致任何错误。

【讨论】:

  • 当前的 C 语言没有隐式声明。编译器应该会报错。
【解决方案2】:

根据手册页,它在stdlib.h

【讨论】:

    【解决方案3】:

    来自 4.10.4.5 的标准系统函数在 stdlib.h 中:

         #include <stdlib.h>
         int system(const char *string);
    

    【讨论】:

      【解决方案4】:

      #include 只携带函数声明(原型),功能由库提供,包含在链接阶段。

      即使你不#include它,只要编译器在编译时假设的定义与库中携带它的定义相匹配,就没有错误,它会起作用。

      【讨论】:

      • 原型是一个声明,而不是一个定义。在这种情况下,定义由 C 库提供。
      • 你是对的,我的错。读作s/definition/declaration/
      • @njsg:请随时编辑您的答案并更正错误
      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      相关资源
      最近更新 更多