9

私はファイルを持っていますmodule.hpp

struct ModuleBase {
    virtual void run() = 0;
};

main.cppプログラム

int main() {
    cout << ...?...; // here should go the contents of module.hpp
}

...?...ヘッダー ファイルの内容をここに出力するには、何を入力すればよいですか?

基本的な考え方は

int main() {
    static const string content = R"(
#include <module.hpp>
)";
    cout << content;
}

しかし、複数行の文字列は C++ 11 でのみ使用でき、複数行の文字列内で#includeは機能しませ(これは良いことです)。

gcc の移植性のない方法があれば...それが始まりです。

明確化(更新): 置換はコンパイル時に行う必要があります。

4

4 に答える 4

5

私が知っている唯一の実際の解決策は、ファイルを、それを含む文字列変数の C++ 定義に変換する小さなプログラムを作成することです。これは非常に簡単に記述できます。次の行に沿って単純なヘッダーを出力します。

char const variableName[] =

次に、ファイルの各行をコピーし、 で囲み、"...\n"必要な文字をエスケープします。(C++11 に自信があるなら、 で何かできるかもしれませんがR"..."、私はこれについて経験がありません。)

[更新:タイプミスのある元の質問を参照]: あなたの解決策はうまくいかないはずです。もしそうなら、それはコンパイラのエラーです。§2.2 によると、トークン化は前 処理ディレクティブの実行前に発生します。したがって、前処理ディレクティブの実行が発生すると、前処理トークンではなく、文字列リテラルが得られます。#(C++11 機能を使用すると、コンパイラ エラーが発生することが予想されます。実装者がすべてのバグを解決するには、まだ十分な時間がありません。)

于 2012-12-20T11:19:26.067 に答える
2

GNU 専用のハックとして、ヘッダーをバイナリ オブジェクト ファイルに変換し、それを実行可能ファイルにリンクすることができます。

まず、 を使用objcopyして変換を行います。

objcopy -I binary -O default -B i386 module.hpp module.hpp.o 

i386必要に応じて、構築しているアーキテクチャに置き換えます。結果のオブジェクト ファイルには、ヘッダーの内容とそのサイズのシンボルが含まれます。次のようにアクセスできます。

#include <iostream>

extern char _binary_module_hpp_start;
extern char _binary_module_hpp_size;

int main()
{
    char * header_start = &_binary_module_hpp_start;
    size_t header_size = reinterpret_cast<size_t>(&_binary_module_hpp_size);

    std::cout.write(header_start, header_size);
}
于 2012-12-20T13:16:31.160 に答える
1

外部ツール以外では、できないと思います。あなたが指定したC++ 11の方法は機能せず#include、文字列に展開されません。例については、こちらを参照してください

C++03 の方法、マクロを使用すると次のようになります。

#define TO_STR__(...) #__VA_ARGS__
#define TO_STR_(...) TO_STR__(__VA_ARGS__)
#define TO_STR(...) TO_STR_(__VA_ARGS__)

#include <iostream>
int main()
{
    std::cout << "String from #include <string>, ";
    static const char* str = TO_STR(
#include <string>
    );

    std::cout << sizeof(str) / sizeof(char) << " characters:\n\n";
    std::cout << str << "\n";
}

GCCでは何も出力されません。Visual Studio 2010 では、#include <string>出力されます。

コンパイル チェーンを変更できる場合は、必要なファイルの内容を文字列として含めるプレビルド ステップを追加できます (CMake やカスタム makefile などのツールを使用して簡単に実行できます)。

于 2012-12-20T11:17:24.627 に答える
0

ofstream を使用して、ファイル ストリームを開き、内容を読み込んで出力できます。

于 2012-12-20T10:58:57.300 に答える