我正在编写一个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。
答案 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函数时,它才能这样做。