受this的启发,我尝试编写使用内部函数的宏,但失败了:
#include <string.h>
// Define a helper macro to get the file name from __FILE__
#define FILENAME_ONLY(file) (strrchr(file, '/') ? strrchr(file, '/') + 1 : file)
// Use the helper macro to create MYFILENAME
#define MYFILENAME FILENAME_ONLY(__FILE__)
// Create __MYFILE__ macro
#define __MYFILE__ "[" MYFILENAME "]"
#include <stdio.h>
int main() {
printf("%s\n", __MYFILE__);
return 0;
}
我得到:
main.cpp:4:80: error: expression cannot be used as a function
#define FILENAME_ONLY(file) (strrchr(file, '/') ? strrchr(file, '/') + 1 : file)
请问我错过了什么?
3条答案
按热度按时间gab6jxml1#
你可以 * 只 * 连接字符串字面量这种方式。
范例:
连接只能在编译时发生。
你不能使用任何东西,但 * 字符串字面量 * 这种方式。
您的宏扩展为:
它不符合这个标准。
作为一个一般性的评论-避免宏和使用只有当你真的明白你在做什么。宏可能非常危险。
简单的例子:
kmpatx3s2#
strrchr
等在运行时执行。像"[" MYFILENAME "]"
这样的字符串连接发生在编译时。你不能把这两者混在一起。强烈建议在运行时使用 function 执行所有这些操作。
ikfrs5lh3#
问题是你不能用这种方式连接宏:
你为什么不
顺便说一句,请记住文件夹分隔符'/'用于unix,''用于windows。