マクロを使用して各メッセージにタイムスタンプとソースファイル名を追加するようなカスタムロギングシステムを維持しています。だから、のようなもの:C++で単一のグローバルchar *を作成する方法
AI_LOG("Hello %s", "World!");
をする可能性があります:
現在(16.38) HelloWorld.cpp LOG: Hello World!
、それはその後、スタック上のchar *バッファを作成し、バッファの先頭に出力の最初の部分を配置し、 snprintfを使用して出力を残りのバッファにコピーします。これはすべて動作しますが、スタックにバッファを作成することを除いて、十分なログステートメントを持つ十分なスタックがあり、バッファをかなり小さく(たとえば256文字)保持しないと、スタックオーバーフローが発生します。もっと長い文字列を出力する必要があるので、スタックにすべてのバッファを置くことはもう私のためには役に立たないでしょう。
その背景を念頭に置いて、私は非常に大きなもの(おそらく4K文字のようなもの)を作成する単一のグローバルchar配列に移動したいと思います。しかし、私の理解は、私はちょうど何かを言うならばということである:私の出力システムの.hファイルに
#define AI_OUTPUT_BUFFER_SIZE 4092
char AI_OUTPUT_BUFFER[AI_OUTPUT_BUFFER_SIZE];
を、私はその.hファイルを含んでいるすべてのファイルで作成されている別のバッファを持つことのリスクを実行します。それは本当の問題ですか?もしそうなら、私が望む単一のバッファを得る良い(コンパイラに依存しない、C++ 98に準拠した、Boost以外の)方法がありますか?
私は、ヘッダーでこれを行うに傾いた:
#define AI_OUTPUT_BUFFER_SIZE 4096
class AIOutputBuffer
{
public:
static char buffer[AI_OUTPUT_BUFFER_SIZE];
};
そして私ができるの.cppに:
char GAIA::AIOutputBuffer::buffer[AI_OUTPUT_BUFFER_SIZE];
しかし、それは私のリンカ頭痛を与えている...たぶん私はよそれはまだ正しく行っていないのですか?
そして、人々がそれを提案する前に、私はおそらくそれを文字列やストリームを使用するように書き換えることができました...しかし、私は本当にシステム全体を書き直したいとは思いませんし、それ。このシステムはうまく動作し、私に多くの柔軟性を与えます。メモリ使用量の問題を処理するだけです。
なぜ、バッファなしでcoutなどを呼び出すマクロを使用しないのですか? –
なぜマクロを使うのですか?コンパイラがあなたのロギング関数をインライン化しないならば、コードをインラインにするのは良い考えです。 – user4581301
@ user4581301機能を使用している場合、回線情報やファイル情報にアクセスすることはできません。 –