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 の良い慣行とはまったく見なされず、非常に醜いものでもあります。
これに対するエレガントでシンプルなソリューションを提供する、私が知らない他のトリック/ハックはありますか?