私の問題は、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ラッパーを書く方法