如何防止 extern "C" 函数重载?

How can I prevent overloading for extern "C" functions?

我正在编写一个 C++ 库,它公开了一些仅由 C# 代码使用的函数。然而,由于我不小心输错了参数,我发现只要不使用cpp文件中的(非输错版本)功能,这段代码即使没有任何警告也可以成功编译和链接。

struct Dummy { int a; double b; };
extern "C" void SetArray(Dummy* x, int cnt);
void SetArray(Dummy x, int cnt)
{
    // a TODO placeholder.
}

如何让编译器针对这种情况抛出错误或警告?编译器选项 -Wall 已设置,但仍然没有警告。使用 tdmgcc 5.1.0.

你可以做一些断言,如果函数重载就会失败:

static_assert(::std::is_same_v<void (Dummy *, int), decltype(SetArray)>);

error: decltype cannot resolve address of overloaded function

您可以在定义和声明中包含 extern "C"

struct Dummy { int a; double b; };
extern "C" void SetArray(Dummy* x, int cnt);
extern "C" void SetArray(Dummy x, int cnt)
{
    // a TODO placeholder.
}

Quentin 对 VTT 回答的评论说到一半:不是说 C 函数不能重载,而是 C 函数不能和​​其他 C 函数一起重载。编译器会强制执行此操作,但只有当您在两个声明中明确指定需要 C 函数时,它才会执行此操作。