c - API设计——分配输出?

标签 c api api-design

C API 函数分配其输出或让用户指定输出缓冲区是个好主意吗?例如:

BOOL GetString(
    PWSTR *String
    );
...
PWSTR string;
GetString(&string);
Free(string);

对比

BOOL GetString(
    PWSTR Buffer,
    ULONG BufferSize,
    PULONG RequiredBufferSize
    );
...
// A lot more code than in the first case

更具体地说,我想知道为什么 Win32 API 主要使用第二种情况(例如 GetWindowTextLookupAccountSid )。如果 API 函数知道输出有多大,为什么还要让用户尝试猜测输出大小?我找不到关于为什么使用第二种情况的任何信息。

此外:LookupAccountSid 示例特别糟糕。它在内部使用 LSA API,为调用者分配输出。然后 LookupAccountSid 让用户在它可以从 LSA 返回输出时分配一个缓冲区(并猜测正确的缓冲区大小)!为什么?

最佳答案

Win32 API 不预先分配缓冲区,因为它想让调用代码选择如何提供缓冲区。它允许他们提供堆栈和各种基于堆的缓冲区。有几个地方缓冲区的最大大小是提前知道的,开发人员希望使用基于堆栈的缓冲区的简单性。

文件系统是最好的例子,因为路径不会超过 MAX_PATH。所以而不是分配+免费。开发人员只需声明一个基于堆栈的缓冲区。

让 C API 分配内存的好处是它简化了调用模式。 Win32 模式的缺点是大多数时候您最终会调用 API 两次。第一次确定缓冲区的大小,然后第二次使用适当大小的缓冲区。使用 API 分配的缓冲区只需要一次调用。

缺点是你从调用者那里拿走了分配的选择。此外,您必须传达您的选择,以便他们正确释放 API(例如,windows 可以从几个不同的地方分配)。

关于c - API设计——分配输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090311/

相关文章:

c - cuda和矩阵运算中的Grid-Stride Loop,为什么我们需要它?

谁能解释一下如何从函数返回 C 中的二维数组?

node.js - 多次/循环请求 REST API 时处理连接丢失(客户端)

api - 国标英语还是美式英语?

node.js - 如何以编程方式过滤与 API 端点匹配的用户名?

c - 如何 scanf ("%[^\n]", str);在 C 编程工作?

有人能明白为什么我这里有浮点异常吗?

c++ - 从 C++ 调用 Python 的问题

api - 没有必填字段的请求的正确 HTTP 响应代码是什么

java - 我如何将此 jar/api 放入我的项目中