この記事は2020年06月04日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC++/CLIでログ出力する方法についてです。
2. C++/CLIでログ出力する
C++/CLIでログ出力するには以下のような実装にします。
今回は
<ファイル名> <関数名>(<行番号>) <メッセージ>
の形式でログを出力します。
ポイントは"ファイル名"、"関数名"、"行番号"は自動的に付加されるようにしています。
またメッセージも可変長引数でパラメータ指定可能です。
実装例
Log.h
#pragma once #include <string.h> #using <system.dll> // Debug::WriteLineのために必要 // "DEBUG"マクロをコメントアウトすれば、ログは出力されません。 #define DEBUG // __FILE__はファイルパス名のため、下記のマクロでファイル名のみ切り出します。 #define FILE (strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__) // ログを出力する場合、"LogDebug"関数ではなく"LOG_DEBUG"マクロを呼び出してください。 // 直接LogDebug関数を呼び出した場合、呼び出し元のファイル名、関数名、行番号が付加されません。 #ifdef DEBUG #define LOG_DEBUG(fmt, ...) CLog::LogDebug(FILE, __FUNCTION__, __LINE__, fmt, ##__VA_ARGS__) #else #define LOG_DBUG(fmt, ...) #endif namespace Log { using namespace System; using namespace System::Diagnostics; public ref class CLog { // このクラスはインスタンス化させないため、コンストラクタはprivateにします。 private: CLog(); public: /** * @brief デバッグログを出力します。 * * @param [in] file ファイル名 * @param [in] func 関数名 * @param [in] line 行番号 * @param [in] fmt メッセージ * @param [in] args メッセージに埋め込む可変長引数 */ static void LogDebug(const char* file, const char* func, int line, String^ fmt, ... array<Object^>^ args) { // メッセージに可変長引数を埋め込みます。 String^ message = String::Format(fmt, args); // ログを<ファイル名> 関数名(行番号) メッセージの文字列にします。 String^ log = String::Format("{0} {1}({2}) {3}", gcnew String(file), gcnew String(func), line, message); // ログをコンソールに出力します。 Debug::WriteLine(log); } }; }
Log.cpp
#include "Log.h" using namespace Log; CLog::CLog() { }
main.cpp
#include "Log.h" using namespace Log; int main() { // 文字列をそのまま出力します。 LOG_DEBUG("Hello world!"); // パラメータを埋め込み文字列で出力します。 LOG_DEBUG("{0:D} {1}", 2020, "Hello world!"); return 0; }
実行結果
main.cpp main(7) Hello world! main.cpp main(8) 2020 Hello world!
3. おわりに
以前
を紹介しました。
今回、久しぶりにC++/CLIを触りだしたので、関連の情報を紹介しました。
リンク
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688