Ответ 1
Вы можете сделать некоторое утверждение, которое потерпит неудачу, если функция перегружена:
static_assert(::std::is_same_v<void (Dummy *, int), decltype(SetArray)>);
error: decltype не может разрешить адрес перегруженной функции
Я пишу библиотеку 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 не может разрешить адрес перегруженной функции
Вы можете включить 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.
}
Комментарий Квентина по ответу VTT был на полпути: это не значит, что функции C не могут быть перегружены, что функции C не могут быть перегружены другими функциями C. Компилятор выполнит это, но это может сделать только это, если вы явно укажете, что вы хотите использовать функцию C в обеих объявлениях.