宏定义在组合过程中导致错误
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")
我试图让宏打印出文件名,后跟行号,然后是打印消息,这是我正常执行此操作的方法,它可以工作,但它打印出整个文件路径到文件:
#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")