我试图让宏打印出文件名,后面跟着行号,然后是打印消息,这是我通常是如何做到的,它可以正常工作,但是它打印出文件的整个文件路径:
#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:\Users\Work\Documents\CastEngine\CastDriver\src\main.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:\Users\Work\Documents\CastEngine\CastDriver\src\main.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:\Users\Work\Documents\CastEngine\CastDriver\src\main.cpp:20:5: note: in expansion of macro 'TESTER2'
TESTER2("Hello\n");我真的不知道如何解决这个问题,任何帮助都将不胜感激。
发布于 2021-06-04 15:40:49
您可以有多个连续的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")发布于 2021-06-04 15:30:58
你总是可以用一个函数来清理它。
printf("%s:%d",
absl::StripPrefix(__FILENAME__, "C:\Users\Work\Documents\CastEngine\CastDriver\"),
__LINE__);https://stackoverflow.com/questions/67839957
复制相似问题