宏定义在组合过程中导致错误

Macro definition causing error during composition

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

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

我真的不知道如何解决这个问题;任何帮助将不胜感激。

你总是可以只使用一个函数来清理它。

printf("%s:%d",
       absl::StripPrefix(__FILENAME__, "C:\Users\Work\Documents\CastEngine\CastDriver\"),
       __LINE__);

您可以有多个连续的 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")