【发布时间】:2018-05-15 10:55:10
【问题描述】:
我的目标是打印文件名而不是文件名的相对路径。我正在使用宏TRACE() 进行试验。
由于它们都在同一个文件中,我将文件名模拟为TRACE() 的输入。所以在现实生活中,你可以说输入被替换为__FILE__。
代码:
#include <stdio.h>
#include <string.h>
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define __FILENAME__(x) TOSTRING(strrchr(x, '\\'))
#define TRACE(s, ...) \
{ \
if (strrchr(s, '\\')) { \
static const char str[] = __FILENAME__(s) "\n\r"; \
printf(str, ##__VA_ARGS__); \
} else { \
static const char str[] = s "\n\r"; \
printf(str, ##__VA_ARGS__); \
} \
}
int main() {
TRACE("file.c");
TRACE("parent\\file.c");
return 0;
}
输出:
file.c
strrchr("parent\\file.c", '\\')
所以如果是本地文件,它会打印为file.c,这很好。这意味着宏中的ifcase 正在工作:)。但是当它是另一个文件夹中的文件时,我无法“字符串化”计算strrchr(s, '\\')。为什么?
此外,我没有看到定义中的计算存在问题,因为所有内容都是在编译时定义的! (这就是if 案例有效的原因,对吧?)
如果我从__FILENAME__ 中删除TOSTRING(),则会收到大量错误。因为它无法将__FILENAME__ 的输出与str[] 连接起来
有没有办法解决这个问题?
【问题讨论】:
-
与您的问题无关,但所有以两个前导下划线(或一个前导下划线后跟一个大写字母)开头的符号在所有范围内都保留用于“实现”(编译器和标准库) .你不应该在任何地方自己使用这些符号。
-
@Someprogrammerdude 检查!
-
我没有看到定义中的计算有问题,因为一切都是在编译时定义的 -- 不,在运行时选择了正确的分支。跨度>
-
TOSTRING(strrchr(s, '\\'))被转换为"strchr(s, '\\')"。这是你想要的吗? -
请注意,在行尾使用
\r\n比使用\n\r更传统。