40

「todo」項目をコードに追加するために、コンパイラ出力にメッセージを入れたいと考えています。
次のようにしたいと思います。

c:/temp/main.cpp(104): TODO - add code to implement this

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

しかし、__LINE__マクロは に展開されているようintで、書き込みが許可されていません

#pragma message( __FILE__ "("__LINE__"): ..." )

別の方法があるでしょうか?

4

6 に答える 6

50

出力ペインをクリックできるようにするものを次に示します。

(他にも素敵なTipsがあります)

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): 注意: この問題を解決してください!

于 2011-05-11T15:37:11.727 に答える
12

今これを作ったばかりで、私の古い使用法よりも確実に優れています#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\metatest.cpp@33

唯一の欠点は、(コンソールペインのメッセージをダブルクリックして)この行にジャンプできないことです__pragma(ただし、それを使用したテストは#pragmaとにかくそうではないようです...)

于 2011-05-11T15:25:50.340 に答える
4

これは、コードにブックマークを付ける必要があるたびにディレクティブを打ち込むのが面倒だと思う人のための回答の補足#pragmaです。これを行うマクロを作成することで、いくつかのキーストロークを節約できます! 一般に、マクロ内にディレクティブを含めることはできませんが#pragma、MS C/C++ コンパイラ 2008 以降では__pragma、マクロで使用できる と呼ばれる特別なベンダー固有の拡張機能がサポートされています。プラグマ ディレクティブおよび __Pragma キーワードを参照してください。

私は日常的に次のようなものを使用しています。

#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();
}

ニーズに合わせて簡単に拡張し、警告を追加できます。このようなシステムを持つことの良い点は、ビルド設定で適切なマクロを設定することにより、コード レビュー項目のみを選択的にオンにすることができ、他のことを心配する必要がないことです。

于 2012-04-05T20:55:13.453 に答える
3

これにより、#pragma (Microsoft 固有だと思います) なしで使用できます。クリックすると、通常のエラー/警告メッセージと同じようにファイルと行番号が表示されるため、他のメッセージが表示されないため、その行に移動します。これをする。これは __pragma なしで機能していましたが、新しいバージョンの msvc では必要です。90年代からずっと使っています。Visual Studio 2013 を使用しています

#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) :"ここに単体テストを追加する必要があります"

于 2013-11-01T21:38:35.130 に答える
0

#トークンを使用します。以下に MSDN の例を投稿しました。

// collisions.h
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __LOC__ __FILE__ "("__STR1__(__LINE__)") : Warning Msg: "

// collisions.cpp
#pragma message(__LOC__"Need to do 3D collision testing")
于 2011-05-11T15:22:14.607 に答える