2009-03-06 3 views
1

デバッグとロギングのライブラリでは、プロジェクトがコンパイルしたすべてのソースファイルのリストを実行時に見つけることができます。リンクされた。私は、各ソースファイルにいくつかのヘッダーを含めることを前提としています。プリプロセッサの__FILE__マクロは、そのファイルの文字定数を与えることができるので、各ファイルからその情報を "ブロードキャスト"してランタイム関数。各C/C++ソースファイルを登録して使用するソースのランタイムリストを作成する

これをうまくやり遂げる方法は、特にC++とは対照的にCから行うことができるかどうかです。 C++では、ファイル名のリストを保持する静的な記憶域を持つクラスを作成しようとします。各ヘッダーファイルは、そのクラスのファイルローカル静的インスタンスを作成し、FILEポインターなどをクラスの静的データメンバーに、おそらくはリンクリストとして追加します。

しかし、私はこれがC言語でも動作するとは思っていませんし、C++でもそれぞれの要素が作成されることは保証されていません。

+0

あなたはmakefileやVisual Studio/Eclipse/etcを使用していますか? –

答えて

4

私はコードの中でこのようなことはしません。私は、プロジェクトファイル(vcproj、makefile、または* .c *ファイル用のプロジェクトディレクトリをスキャンする)を解析したツールを書いて、何らかのプリコンパイルのすべてのソースファイルの名前を含む追加のCソースファイルを生成しました。初期化されたデータ構造。

ビルドプロセスを実行するたびに、すべてが自動的に実行されるように、そのツールをビルドプロセスの一部にします。実行時には、構築されたデータ構造を読み取るだけです。

+0

vcprojを解析することは余分な仕事です。 Scan dirは何も保証しません。 –

0

「パッシブ」モードで概要を描く方法でこれを行うことはできません。つまり、レジストリに追加するソースファイルごとに何らかのコードを実行するつもりです。自動的に実行するのは難しいです。

もちろん、マクロを使用してそのコードを邪魔にならないようにすることは可能です。 "エントリポイント"を持たないCソースファイルには問題がある可能性があります。各モジュールの機能はinit()です。静的な初期化コードが可能かもしれませんが、物事が初期化された順番で問題が発生するかどうかは100%確信していません。

staticレジストリモジュールを使用すると、プロジェクトに汎用ユーティリティライブラリが含まれていない場合、プレインリンク型リストまたは単純なハッシュテーブルを実装するのが簡単になります。

+0

自動化することができます。私の答えを見てください。 –

0

解決策では、あなたのソリューションは動作します。それは保証されています。

編集:各「G ++ file.cpp」に「-include 『cfiles_register.h』」 を追加するために、あなたのメイクファイルでルールを変更します。ちょうど私の頭の中で解決策を見つけました。

あなたの提案したimplemnatationを「cfiles_register.h」に入れてください。

1

Theresのあなたは、このようなクラスを作成することができますC++ではCでそれを行うにはない方法:StaticDictionaryは、すべてのファイル名のシングルトンのコンテナである

struct Reg { 
    Reg(const char * file) { 
     StaticDictionary::Register(file); 
}; 

。そして、各ソースファイルに:

static Reg regthisfile(__FILE__); 

あなたは辞書Meyersシングルトンを作成問題の順序を避けるためにしたいでしょう。

+0

この場合の注文はなぜ問題なのですか? –

+0

静的辞書は、使用する前に必ず作成する必要があります。グローバルの作成順序に依存することはできないため、まずシングルトンパターンを使用してグローバルを作成する必要があります。 –

+0

StaticDictionary :: Registerはこの仕事をしませんか? –

2

私はFerruccioに同意します。これを行う最も良い方法は、コード自体ではなく、ビルドシステムで行うことです。彼のアイデアの拡張として、ファイルのリスト(とにかく知っておく必要がある)を文字列または文字列としてCファイルにダンプするターゲットをビルドシステムに追加し、このファイルをソースにコンパイルします。ソースコード管理システムのバージョン番号、実行可能ファイルを作成した人物などの追加情報を追加したい場合は、ソース内で多くの複雑化を避けることができます。

0

C++で静的インスタンスを使用するとうまく動作します。あなたがCにも、これを行うことができますが、あなたはランタイム固有の機能を使用する必要が

- MSVC CRTのためには、Cのためにhttp://www.codeguru.com/cpp/misc/misc/threadsprocesses/article.php/c6945/

を見てみましょう - あなたは、マクロでそれを行うこと - に対応するという名前の変数を定義しますあなたのファイル、そしてあなただけのアイデアとして、あなたの実行可能ファイルのシンボルをスキャンできます。

#define TRACK_FILE(name) char _file_tracker_##name; 

は、このようなあなたのmy_c_file.cでそれを使用します。

TRACK_FILE(my_c_file_c) 

とgrepのすべてのファイル/

2

本当にいいが、ない...この

nm my-binary | grep _file_tracker 

のようなバイナリから変数名UNIXおよびLinux上の標準的な方法はありより - identが。すべてのソースファイルについて、IDタグを作成します。通常、これはバージョン管理システムによって割り当てられます。 SVN keywords

次に、各ソースファイルの名前とリビジョンを確認するには、identコマンドを使用してください。実行時に実行する必要がある場合は、identがどのように実行されているかをチェックしてください - そのソースは自由に利用できるはずです。

0

恐ろしいアイデアは、私は確信していますが、シングルトンを使用してください。各ファイルには、

Singleton.register(__FILE__); 

などのグローバルスコープがあります。それはcppファイルでしか動作しません。 私は何年も前の初心者のようなことをやってくれました。しかし、私は今それをするのがうんざりだ。私は今ビルドステップを追加したいと思います。

0

私は実行時にこれを行うことを避けるために優れていると言う人たちに同意するが、Cには、あなたが関数呼び出しと静的変数を初期化することができ、それはすべてのファイルには、次のとおりです。

static int doesntmatter = register(__FILE__); 
+0

レジスタはcのキーワードであり、一般的には避けるべきです – EvilTeach

+0

はい、同意します。それは別の答えから取ったものです - 盲目的には - :) – dmityugov

関連する問題