Как я могу использовать #pragma message(), чтобы сообщение указывало на файл (lineno)?
Чтобы добавить элементы "todo" в мой код, я хочу поместить сообщение в выходной файл компилятора.
Я бы хотел, чтобы это выглядело так:
c:/temp/main.cpp(104): TODO - add code to implement this
чтобы использовать функциональность вывода сборки Visual Studio, чтобы перейти к соответствующей строке, дважды щелкнув ее.
Но макрос __LINE__
, кажется, расширяется до int
, что запрещает запись
#pragma message( __FILE__ "("__LINE__"): ..." )
Будет ли другой способ?
Ответы
Ответ 1
Здесь вы можете щелкнуть по области вывода:
(Есть и другие полезные советы)
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): Напоминание: устраните эту проблему!
Ответ 2
просто взбивал это сейчас, и это, несомненно, превосходит мое старое решение с использованием #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
похоже, это не так..)
Ответ 3
Это дополнение к ответу для тех, кто считает, что нужно утомиться в директивах #pragma
каждый раз, когда им нужно поместить закладку в код: вы можете сэкономить несколько нажатий клавиш, взбив макрос, чтобы сделать это для тебя! Хотя в целом вы не можете иметь директиву #pragma
в макросах, компиляторы MS C/С++ 2008 и выше поддерживают специальное специальное расширение, называемое __pragma
, которое может использоваться с макросами. См. Директивы 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();
}
Вы можете легко расширить его в соответствии с вашими потребностями и добавить дополнительные предупреждения. Хорошая часть такой системы состоит в том, что вы можете выборочно включать, только элементы кода, и не нужно беспокоиться ни о чем другом, установив соответствующий макрос в настройках сборки.
Ответ 4
Это позволяет использовать его без #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): "Нужно добавить модульное тестирование здесь"
Ответ 5
Используйте #
токен. Я привел пример из 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")
Ответ 6
На Visual C++ вы можете просто сделать
#pragma message(__FILE__ "(" _CRT_STRINGIZE(__LINE__) ")" ": warning: [blah]")
_CRT_STRINGIZE
часто уже определен в некотором заголовке, но если это не так, вы можете определить его:
#define _CRT_STRINGIZE_(x) #x
#define _CRT_STRINGIZE(x) _CRT_STRINGIZE_(x)