Как я могу предотвратить перегрузку для внешних функций "С"?

Я пишу библиотеку 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.

Ответ 1

Вы можете сделать некоторое утверждение, которое потерпит неудачу, если функция перегружена:

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

error: decltype не может разрешить адрес перегруженной функции

Ответ 2

Вы можете включить 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 в обеих объявлениях.