web-dev-qa-db-ja.com

外部「C」関数の過負荷を防ぐにはどうすればよいですか?

私は、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が設定されていますが、警告はありません。 tdmgcc5.1.0を使用します。

16
Apliex-Ddr

関数がオーバーロードされた場合に失敗するアサーションを作成できます。

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

エラー:decltypeはオーバーロードされた関数のアドレスを解決できません

18
user7860670

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の答えに対するQuentinのコメントは、その途中でした。C関数をオーバーロードできないということではなく、C関数を他のC関数でオーバーロードできないということです。コンパイラはこれを強制しますが、両方の宣言でC関数が必要であると明示的に指定した場合にのみ強制できます。

13
user743382