私は、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を使用します。
関数がオーバーロードされた場合に失敗するアサーションを作成できます。
static_assert(::std::is_same_v<void (Dummy *, int), decltype(SetArray)>);
エラー: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の答えに対するQuentinのコメントは、その途中でした。C関数をオーバーロードできないということではなく、C関数を他のC関数でオーバーロードできないということです。コンパイラはこれを強制しますが、両方の宣言でC関数が必要であると明示的に指定した場合にのみ強制できます。