如何防止外部"C"函数的重载?

Apl*_*Ddr 16 c++ overloading compilation extern

我正在编写一个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.
}
Run Code Online (Sandbox Code Playgroud)

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

use*_*670 18

如果函数重载,您可以进行一些失败的断言:

static_assert(::std::is_same_v<void (Dummy *, int), decltype(SetArray)>);
Run Code Online (Sandbox Code Playgroud)

错误:decltype无法解析重载函数的地址

  • @ Apliex-Ddr要使用c ++ 11,这个代码片段只需要进行一些更改:使用`:: std :: is_same`和强制断言消息. (3认同)

小智 13

您可以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.
}
Run Code Online (Sandbox Code Playgroud)

Quentin对VTT答案的评论是在那里:不是C函数不能过载,而是C函数不能用其他C函数重载.编译器将强制执行此操作,但只有在两个声明中明确指定需要C函数时才能执行此操作.