【发布时间】:2021-10-04 00:46:32
【问题描述】:
我用 cmake 加载一个路径名
add_definitions(-DMY_PATH =${CMAKE_INSTALL_FULL_DATADIR}/path)
并想在我的 C++ 程序中用作字符串来加载一些数据。为此,字符串化运算符# 非常方便——我使用this answer 中提供的宏,它与here 相同。现在,当我的路径中有“linux”或“unix”时,这是非常错误的(至少对于 gcc),因为这些名称只是被“1”替换:
#include <stdio.h>
#define xstr(a) str(a)
#define str(a) #a
#ifndef MY_PATH
#define MY_PATH /path/x86-unix/linux/path
#endif
int main()
{
char my_path_str[] = xstr(MY_PATH);
printf("my path is %s", my_path_str);
return 0;
}
谁能提示为什么会发生这种情况以及如何防止它? 有一个类似的问题here,但是没有合适的答案可以和cmake一起使用。
【问题讨论】:
-
当您在路径中使用 macro 时会出现“严重错误”。始终使用字符串作为路径,即使您将它们定义为宏。
-
@Someprogrammerdude 如果您使用 Windows 路径,这是一个问题,因为反斜杠被视为转义字符。 # 运算符考虑了这一点
-
I load a path name with cmake and want to use as a string如何你“用cmake加载路径”?请显示 cmake 代码。你想使用configure_file吗?您是否阅读了cmake.org/cmake/help/latest/command/configure_file.html 并检查了带有字符串示例的示例部分?你在问 XY 问题吗? -
但它带来了更多更难解决的问题(否则你不会在这里问,对吧?;))。甚至大多数初学者都知道需要转义反斜杠。此外,Windows 无论如何都支持正常路径的正斜杠。
-
@Someprogrammerdude 是的,确实如此。但是,如果用户提供带有反斜杠的路径,我就有问题了。另外,在 windows 上使用时,cmake 还可以抓取带有反斜杠的路径。