为什么windows api需要传递这么多参数

时间:2014-08-16 06:46:55

标签: c 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

);

为什么这么复杂?即使每个参数都需要,我们也不需要强制用户一次传递每个参数,可以稍后设置,提供“construtor”等等。

编辑:c不支持默认值,因此我删除了此选项

1 个答案:

答案 0 :(得分:2)

MS选择提供“少量”非常灵活的API,允许程序员完成大量工作。如果他们没有添加所有这些参数,那么就有各种各样的事情无法做到。并且记住这个API在C-没有默认值(并且在这么大的函数调用中真的默认值是一个坏主意)并且没有具有默认构造函数的类(因此需要0输出内存,如本示例中那样)可以设置默认值值。在很多情况下,MS不想猜测默认值应该是什么 - 他们不知道程序员将如何使用他们的API并决定不去假设。它与今天基于Java的理念不同,一切都是框架,握住新手的手(并且手铐实际上知道他在做什么的人)。

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