如何防止外部“ C”函数过载?

时间:2018-08-03 10:04:34

标签: c++ compilation extern overloading

我正在编写一个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。

2 个答案:

答案 0 :(得分:18)

您可以做出一些断言,如果函数重载,断言将失败:

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

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

答案 1 :(得分:13)

您可以在定义以及声明中包括class CronjobForm(forms.Form): valves = forms.ModelChoiceField(required=True, widget=forms.Select, queryset=Valve.objects.all())

extern "C"

Quentin对VTT答案的评论只是一半:不是C函数不能被重载,而是C函数不能被其他C函数重载。编译器将强制执行此操作,但只有在您在两个声明中都明确指定要使用C函数时,它才能这样做。