宏定义导致合成过程中出错



我正试图让宏打印出文件名,然后是行号,然后是打印消息,这是我通常的做法,它可以工作,但它打印出文件的整个文件路径:

#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__);

最新更新