#pragma message()を使用して、メッセージがファイル(lineno)を指すようにするにはどうすればよいですか?

Source c++ visual-studio-2010 pragma line-numbers predefined-macro

'todo'項目をコードに追加するために、コンパイラー出力にメッセージを入れたいと思います。
私はそれをこのように見せたいです:
c:/temp/main.cpp(104): TODO - add code to implement this

Visual Studioのビルド出力機能を利用して、ダブルクリックしてそれぞれの行に移動します。

しかし、__LINE__マクロはintに展開されているようで、書き込みができません
#pragma message( __FILE__ "("__LINE__"): ..." )

別の方法はありますか?
推奨答え
これは、出力ペインをクリックできるようにするものです。

(そこには他にもいくつかの素晴らしいヒントがあります)

http://www.highprogrammer.com/alan/windev/visualstudio.html
 // Statements like:
 // #pragma message(Reminder "Fix this problem!")
 // Which will cause messages like:
 // C:\Source\Project\main.cpp(47): Reminder: Fix this problem!
 // to show up during compiles. Note that you can NOT use the
 // words "error" or "warning" in your reminders, since it will
 // make the IDE think it should abort execution. You can double
 // click on these messages and jump to the line in question.

 #define Stringize( L )     #L 
 #define MakeString( M, L ) M(L)
 #define $Line MakeString( Stringize, __LINE__ )
 #define Reminder __FILE__ "(" $Line ") : Reminder: "

定義したら、次のように使用します。
#pragma message(Reminder "Fix this problem!") 

これにより、次のような出力が作成されます。

C:\Source\Project\main.cpp(47): Reminder: Fix this problem!

その他答え #1
今これを泡立てただけで、#errorを使用するという私の古いソリューションを確実に上回ります:D
#define _STR(x) #x
#define STR(x) _STR(x)
#define TODO(x) __pragma(message("TODO: "_STR(x) " :: " __FILE__ "@" STR(__LINE__)))

これは、好きなように/ニーズに合わせて変更できます。
その使用例:
//in code somewhere
TODO(Fix this);

コンソールペインの出力:
1>TODO: Fix this :: c:\users\administrator\documents\visual studio 2008\projects\metatest\metatest\[email protected]

唯一の欠点は、__pragmaを使用して(コンソールペインのメッセージをダブルクリックして)この行にジャンプできないことです(ただし、#pragmaでテストすると、とにかくそうではないようです...)
その他答え #2
これにより、#pragma(Microsoft固有だと思います)なしで使用できます。クリックすると、通常のエラー/警告メッセージと同じようにファイルと行番号が表示されるため、行に移動します。他のメッセージは表示されないためです。これをする。これは、以前は__pragmaなしで機能していましたが、新しいバージョンのmsvcでは必要です。私は90年代のいつかからそれを使用しています。 Visual Studio2013を使用しています
#define MacroStr(x)   #x
#define MacroStr2(x)  MacroStr(x)
#define Message(desc) __pragma(message(__FILE__ "(" MacroStr2(__LINE__) ") :" #desc))

例:
Message("Need to add unit testing here")

出力:
1> c:\ source \ include \ mithrilsoftware.h(180): "ここにユニットテストを追加する必要があります"
その他答え #3
これは、コードにブックマークを付ける必要があるたびに#pragmaディレクティブをパンチするのが面倒だと思う人のための答えの補足です。これを行うためにマクロをホイップすることで、いくつかのキーストロークを節約できます。一般に、マクロ内に#pragmaディレクティブを含めることはできませんが、MS C / j_C++ _ jコンパイラ2008以降は、マクロで使用できる__pragmaと呼ばれる特別なベンダー固有の拡張機能をサポートしています。 Pragma Directives and the __Pragma Keywordを参照してください。

私は日常的に次のようなものを使用しています。
#define STR2(x) #x
#define STR1(x) STR2(x)
#define LOC __FILE__ "("STR1(__LINE__)") : Warning Msg: "
#define WARNING_BUILDER(x) __FILE__ "("STR1(__LINE__)") : Warning Msg: " __FUNCTION__ " requires " #x
#define WREVIEW WARNING_BUILDER(review)
#define WUT WARNING_BUILDER(unit-testing)

#ifdef SPECIAL_WARNINGS
    #ifdef SPECIAL_WARNINGS_REVIEW
        #define MARK_FOR_REVIEW() do { \
                    __pragma(message( WREVIEW )) \
                } while (0)
    #else
        #define MARK_FOR_REVIEW 
    #endif

    #ifdef SPECIAL_WARNINGS_UNIT_TEST
        #define MARK_FOR_UNIT_TEST() do { \
                    __pragma(message( WUT )) \
                } while (0)
    #else
        #define MARK_FOR_UNIT_TEST 
    #endif
#endif


// uncomment/set in build-environment to enable special warnings
//#define SPECIAL_WARNINGS
#ifdef SPECIAL_WARNINGS
// uncomment/set in build-environment if you want only code review warnings
//#define SPECIAL_WARNINGS_REVIEW
// uncomment/set in build-environment if you want only unit-test warnings
//#define SPECIAL_WARNINGS_UNIT_TEST
#endif

int main()
{
MARK_FOR_REVIEW();
MARK_FOR_UNIT_TEST();
}

ニーズに合わせて簡単に拡張し、警告を追加できます。このようなシステムの良いところは、ビルド設定で適切なマクロを設定することで、コードレビュー項目のみを選択的にオンにすることができ、他のことを心配する必要がないことです。
その他答え #4
Visual j_C++ _ jでは、次のことができます。
#pragma message(__FILE__ "(" _CRT_STRINGIZE(__LINE__) ")" ": warning: [blah]")
_CRT_STRINGIZEは、多くの場合、すでにいくつかのヘッダーで定義されていますが、そうでない場合は、次のように定義できます。
#define _CRT_STRINGIZE_(x) #x
#define _CRT_STRINGIZE(x) _CRT_STRINGIZE_(x)

関連記事

内部結合中に結合された列の名前を変更することはできますか?
github gistの特定のrevisionを削除するにはどうすればよいですか?
std::stringを使用してバイナリデータを保持し、手動の動的メモリ管理を回避することは有効ですか?
J_C_jとJavaのLogicdifferences
j_C++ _ j STLでの二分探索木の実装?