我正在将用 C++ 编写的应用程序从 Windows 移植到 Linux。我的头文件路径有问题。Windows 使用\
,Linux 使用/
. 我发现在每个源文件和头文件中更改它很麻烦。有什么解决办法吗?
6 回答
始终在#include 路径中使用正斜杠。将路径映射到底层操作系统支持的任何斜线/目录方案是编译器的工作。
你们这些人! 是的,您可以而且应该始终使用正斜杠。我认为问题是如何从这里到达那里!
如果你安装了 Perl,下面一行代码会将 C++ 源文件转换为使用正斜杠,将原始版本保存在扩展名为 的文件中.bak
:
perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" myfile.cpp
(上面的命令行适用于 Windows;如果您使用的是 Linux 或其他类 Unix shell,请在第三个参数周围使用单引号而不是双引号。)
如果您有一堆文件需要转换,请说所有以 结尾的文件.cpp
:
for %f in (*.cpp) do perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" %f
Bourne shell 环境(典型的 Linux shell)的相应命令:
for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done
如果您没有安装 Perl,您应该能够找到一个允许跨文件搜索和替换的文本编辑器。
Windows API一直支持正斜杠作为目录分隔符。那是因为至少早在 DOS 3.1 时它也受到支持。问题一直是 COMMAND.COM 和 CMD.EXE。他们使用正斜杠作为选项指示符(而不是 Unix 中的破折号)。在使用字符串中的反斜杠来转义特殊字符的语言中,永远不要使用反斜杠作为目录分隔符。
如果您缺少 Unix shell,难道您没有一个可以跨多个文件搜索/替换的编辑器吗?哎呀,如果必须的话,写一个小程序来做。解析其#include 语句的C++ 源代码并不难。
在#include 指令中始终使用正斜杠。一些操作系统/编译器需要它,而 Windows/Visual Studio 足够聪明,可以正确处理它。
由于您从 Windows 代码开始,我假设您有 Visual Studio。使用查找和替换对话框并创建一个正则表达式来为您进行替换。对所有文件运行查找和替换。
例如,使用这样的东西:
#include:b+<{[^\\\>]}\\
为您的搜索表达式和
#include <\1
对于替换表达式(警告:未经测试)。对所有文件运行此操作,直到没有替换。然后将尖括号切换为引号并重复。
您使用的是什么版本的 Windows?据我所知,从 Windows XP 开始,正斜杠确实可以用作路径分隔符。
您可以根据以前的 perl 命令尝试此命令,该命令以递归方式完成工作
find . -type f -name \* | xargs grep '#include' | grep '\\' |awk -F: '{print $1}'|sort| uniq | xargs -n1 perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/'