我正试图让宏打印出文件名,然后是行号,然后是打印消息,这是我通常的做法,它可以工作,但它打印出文件的整个文件路径:
#define TESTER1(...) printf(ANSI_COLOR_BOLD_GREEN "LOG::" __FILE__ ":" STR(__LINE__) "t" ANSI_COLOR_RESET ANSI_COLOR_GREEN __VA_ARGS__); printf(ANSI_COLOR_RESET "n")
这是有效的,但文件路径太长:示例输出:
C:UsersWorkDocumentsCastEngineCastDriversrcmain.cpp:18: Example
我希望输出如下:
main.cpp:18: Example
这是一个宏:
#define __FILENAME__ (strrchr(__FILE__, '\') ? strrchr(__FILE__, '\') + 1 : __FILE__)
#define TESTER2(...) printf(ANSI_COLOR_BOLD_GREEN "LOG::" __FILENAME__ ":" STR(__LINE__) "t" ANSI_COLOR_RESET ANSI_COLOR_GREEN __VA_ARGS__); printf(ANSI_COLOR_RESET "n")
我知道__FILENAME__
按预期工作,因为在没有定义TESTER2的情况下,我使用了以下代码:
printf("%s:%d", __FILENAME__, __LINE__);
输出正是我想要的:main.cpp:19
但是当我从上面添加TESTER2定义时,它会给我以下错误:
error: expression cannot be used as a function
#define __FILENAME__ (strrchr(__FILE__, '\') ? strrchr(__FILE__, '\') + 1 : __FILE__)
^
C:UsersWorkDocumentsCastEngineCastDriversrcmain.cpp:11:59: note: in expansion of macro '__FILENAME__'
#define TESTER2(...) printf(ANSI_COLOR_BOLD_GREEN "LOG::" __FILENAME__ ":" STR(__LINE__) "t" ANSI_COLOR_RESET ANSI_COLOR_GREEN __VA_ARGS__); printf(ANSI_COLOR_RESET "n")
^~~~~~~~~~~~
C:UsersWorkDocumentsCastEngineCastDriversrcmain.cpp:20:5: note: in expansion of macro 'TESTER2'
TESTER2("Hellon");
我真的不知道如何解决这个问题;任何帮助都将不胜感激。
您可以有多个连续的string literals
,编译器会将它们视为一个。
示例:
printf("He" "llo" "wo" "rld.");
但在宏中,__FILENAME__
扩展为strrchr
调用+三元运算,其结果不是string literal
,因此出现语法错误。
#define TESTER2(...) printf(ANSI_COLOR_BOLD_GREEN "LOG::%s" ":" STR(__LINE__) "t" ANSI_COLOR_RESET ANSI_COLOR_GREEN __VA_ARGS__, __FILENAME__); printf(ANSI_COLOR_RESET "n")
您总是可以使用一个函数来清理它。
printf("%s:%d",
absl::StripPrefix(__FILENAME__, "C:UsersWorkDocumentsCastEngineCastDriver"),
__LINE__);