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无法解析重载函数的地址
小智 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函数时才能执行此操作.