プログラムを書こう!

実務や自作アプリ開発で習得した役に立つソフトウェア技術情報を発信するブログ

C++/CLIでログ出力する

この記事は2020年06月04日に投稿しました。

f:id:paveway:20190914064630j:plain

目次

  1. はじめに
  2. C++/CLIでログ出力する
  3. おわりに

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. おわりに

以前

www.paveway.info

を紹介しました。
今回、久しぶりに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

目次へ