【问题标题】:Why does windows API need to pass in so many parameters?为什么windows API需要传入这么多参数?
【发布时间】:2014-08-16 06:46:54
【问题描述】:

为什么旧的 Windows API 要求您传递这么多参数?

示例(来自stack overflow):

// additional information
   STARTUPINFO si;     
   PROCESS_INFORMATION pi;

   // set the size of the structures
   ZeroMemory( &si, sizeof(si) );
   si.cb = sizeof(si);
   ZeroMemory( &pi, sizeof(pi) );

  // start the program up
  CreateProcess( lpApplicationName,   // the path
    argv[1],        // Command line
    NULL,           // Process handle not inheritable
    NULL,           // Thread handle not inheritable
    FALSE,          // Set handle inheritance to FALSE
    0,              // No creation flags
    NULL,           // Use parent's environment block
    NULL,           // Use parent's starting directory 
    &si,            // Pointer to STARTUPINFO structure
    &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread

);

为什么这么复杂?每个参数都是必需的,我们不需要强制用户一次传入每个参数,它们可以稍后设置,提供“构造函数”等等。

edit : C 语言不支持默认值,所以我删除了这个选项

【问题讨论】:

  • C中没有默认参数
  • 这些参数中的每一个都有特定的用途。您不使用它们意味着它们不适合 您的 特定用途。您始终可以将它们包装起来以方便您的需求。 MS 选择不这样做为您不是 API 的问题。

标签: c windows


【解决方案1】:

MS 选择提供“少量”非常灵活的 API,允许程序员做很多事情。如果他们没有添加所有这些参数,那么有很多事情是不可能做的。记住这个 API 在 C 中——没有默认值(在这么大的函数调用中,真正的默认值是个坏主意)并且没有可以设置默认值的具有默认构造函数的类(因此需要像本例中那样将内存设为 0)价值观。在很多情况下,MS 不想猜测默认值应该是什么——他们不知道程序员将如何使用他们的 API,因此决定不去假设。它与今天的基于 Java 的哲学不同,一切都是框架,握着新手的手(给真正知道自己在做什么的人戴上手铐)世界。

此外,在某些情况下,他们决定让事情变得更容易以实现向后兼容性——例如,需要将 si.cb 设置为启动结构的大小——这样启动结构可以被版本化(以后的版本会有更多字段因此不同的大小),并且可以使其与任一版本一起使用。当然,这让 API 稍微复杂了一点,但它让每个人都比让所有可执行文件破坏每个新操作系统更快乐。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2015-09-23
    • 2011-12-07
    相关资源
    最近更新 更多