【发布时间】:2017-08-25 08:45:15
【问题描述】:
在一个dll项目中,函数是这样的:
extern "C" __declspec(dllexport) void foo(const wchar_t* a, const wchar_t* b, const wchar_t* c)
在另一个项目中,我将使用foo 函数,但我在头文件中声明foo 函数
extern "C" __declspec(dllimport) void foo(const wchar_t* a, const wchar_t* b)
我只用两个参数调用它。
结果是成功,我认为这与__cdecl 通话有关,但我想知道这是如何以及为什么会这样。
【问题讨论】:
-
这将取决于 foo 对缺失参数的处理方式,它们将具有随机值。如果在问题中它们是指针,如果 foo 尝试使用它们,则您的应用程序很可能会崩溃。
-
调用和返回将保持堆栈不变,因为在 cdecl 中调用者是从堆栈中删除参数。当然,如果缺少的参数被调用函数访问,它们将具有未定义的值或导致未定义的行为。
-
@RichardCritten 不是随机值,而是不确定值。
-
@tofro 我认为 MichaelWalz 的观点是,例如,这些值不是随机生成的。它们实际上在实践中可能是相当可预测的(例如,堆栈可能对齐,使得该值始终是调用者中某个局部变量的值)。但这不是指定的行为。当询问“如果……会发生什么”时,这可能会产生更大的不同,因为仅测试它可能在一种环境中可靠地工作,但在另一种环境中则不行。对于真正随机的值,您会期望在不同环境中具有相似的值分布。
-
@tofro 不,但这意味着随机生成的一系列内存访问应该与一系列顺序地址一样执行。我并不是想(太)迂腐,而是想澄清我所期望的是 MichaelWalz 的意图。 "Indeterminate Value" 是标准中的技术术语,具有精确的含义,而“随机值”可能不是。