1

私の問題は、C でいくつかのテンプレート関数を呼び出したいということです。

extern "C"したがって、このテンプレート関数を呼び出す関数をラッパー関数として宣言しました。

C++ コンパイラを使用してラッパー関数をコンパイルする必要があることはわかっています。その後、通常の C プログラムに対してリンクできるオブジェクト ファイルを取得します。

問題は、C で使用したいヘッダーのみの C++ ライブラリを作成したことですが、ラッパー関数に対して C プログラムをリンクする必要があると、CI ではライブラリ ヘッダーのみを作成できなくなります。

では、c++ テンプレート関数を呼び出すヘッダーのみの c ライブラリを生成する方法はありますか? このメソッドは GCC で動作するはずであり、非標準である場合はまったく問題ありません。いくつかのプラグマ、cli-parameters、またはその他のものが必要です。

考えられる解決策は、ファイルの C モードで gcc を呼び出すことだと思います。特定の行で、ヘッダー ファイル内で C から C++ に切り替えることができます。この C++ スイッチは実際のテンプレート呼び出しを行い、C コンパイラへのスイッチ バックが実行されます。何か方法はありますか?

たとえば、次のようにします。

#include <iostream>

#define SWITCH_TO_CPP_COMPILER() /*TODO: is this possible?*/
#define SWITCH_BACK_TO_C_COMPILER() /*TODO: is this possible?*/

#ifdef __cplusplus
extern "C" {
#endif
    inline bool wrapper();
#ifdef __cplusplus
}
#endif


SWITCH_TO_CPP_COMPILER();

template<bool tmp>
constexpr bool template_func() noexcept {
    return tmp;
}

inline bool wrapper() {
    return template_func<true>();
}

SWITCH_BACK_TO_C_COMPILER()

#include <stdio.h>

int main() {
    printf("%d\n", wrapper());
}

私はすでにいくつかの質問を見てきましたが、彼らはそれに答えていません:

C++ の C ラッパー: C++ テンプレートを処理するには?

クラスメソッドを公開するためにC++コードの周りにCラッパーを書く方法

C リンカーによってリンクできる C++ ライブラリの周りに C ラッパーを作成する

不要なヘッダー ファイルのない C++ ライブラリの C ラッパー

4

2 に答える 2