1

Zed Shaw のデバッグ マクロは、彼の C の本「Learn C the Hard Way」が無料で読めたときに、彼の Web サイトで見つけました。最初は Linux 用に設計されていましたが、かなりうまく機能し、しばらく使用しています。

現在、Windows 用の C コードを書き始めており、Visual Studio を使用しています。作業中のプロジェクトでこれらのデバッグ マクロを使用したいと考えています。

問題は次のとおりです。 check マクロを使用して、関数がエラーなしで返されることを確認したいとしましょう。

display = al_create_display(640, 480);
check(display, "Failed to create display");

使用されるマクロの定義は次のとおりです。

#define clean_errno() (errno == 0 ? "None" : strerror(errno))
#define log_err(M, ...) fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
#define check(A, M, ...) if(!(A)) { log_err(M, ##__VA_ARGS__); errno=0; goto error; }

ただし、私が遭遇した問題は、Visual Studio がstrerror()非推奨としてマークされ、コンパイルが中止されることでした。プロジェクトでスレッドを使用する予定なので、可能であれば「無視」ルートには行きたくありません。

私がしたclean_errno()ことは、マクロと同じことを行う関数を作成しましたが、グローバル バッファー変数と呼び出しstrerror_s()を使用してコピーし、マクロへのポインターを返すことlog_err()でした。しかし今、私はしなければなりません:

  • この1つの3ライナー関数のためだけに、まったく新しいヘッダーとCファイルを作成します。これは豊富だと思います
  • または、デバッグ マクロのヘッダーで関数を宣言して実装するだけです。これは、C の良い慣行とはまったく見なされず、非常に醜いものでもあります。

これに対するエレガントでシンプルなソリューションを提供する、私が知らない他のトリック/ハックはありますか?

4

1 に答える 1

1

Strerror はスレッド セーフではないため、非推奨です。この事実を気にしない場合は、おそらくVSでこの警告をオフにするオプションを見つけることができます。

しかし、sterror_s() を使用してスレッドセーフ バージョンを実装することも同様に簡単です。マクロは式を評価するだけではありません。具体的には、マクロにバッファを割り当てることは完全に可能です:

#define check(A, M, ...) \
    if(!(A)) { \
        char _buffer[128]; \
        strerror_s(_buffer, 128, errno); \
        fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " (M) "\n", __FILE__, \
                __LINE__, errno? _buffer : "None", ##__VA_ARGS__); \
        errno = 0; \
        goto error; \
    }

私はこのコードをテストしていないので、いくつかのバグがあるかもしれませんが、それは出発点になるはずです.

于 2016-09-22T19:32:08.587 に答える