我不知道为什么有这么多旧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不支持默认值,因此我删除了此选项
答案 0 :(得分:2)
MS选择提供“少量”非常灵活的API,允许程序员完成大量工作。如果他们没有添加所有这些参数,那么就有各种各样的事情无法做到。并且记住这个API在C-没有默认值(并且在这么大的函数调用中真的默认值是一个坏主意)并且没有具有默认构造函数的类(因此需要0输出内存,如本示例中那样)可以设置默认值值。在很多情况下,MS不想猜测默认值应该是什么 - 他们不知道程序员将如何使用他们的API并决定不去假设。它与今天基于Java的理念不同,一切都是框架,握住新手的手(并且手铐实际上知道他在做什么的人)。
此外,在某些情况下,他们决定使向后兼容性变得更容易 - 例如需要将si.cb设置为启动结构的大小 - 这样就可以对启动结构进行版本控制(以后的版本会有更多版本)这样的字段大小不同)并且可以使用任何一个版本。当然,这使得API变得更复杂,但它让每个人都比让所有可执行文件都破坏每个新操作系统更快乐。