我提供了一个应该在GNU / Linux下编译的项目。您可能已经猜到,项目中的所有标题都使用反斜杠符号\
。
我知道,反斜杠是undefined behavior,但我需要编译它。我很确定有一种方法可以让GCC使用它,因为MinGW版本可以正常使用反斜杠(我只是检查过这个)。
最有趣的是该项目是GNU / Linux的应用程序(对于ARM architecture),并且ARM GCC可能正常工作。我是唯一一个本地使用GNU / Linux并希望将桌面应用程序编译为have an easier debug life的人。
将反斜杠替换为斜杠并迫使同事重新学习使用其他角色不是这样的:我只是一名大三学生,但已经在这里工作了4到7年的同事;他们只是听不到我的声音。所以,我们在这里......
答案 0 :(得分:5)
用斜杠替换反斜杠。告诉你的同事看看这个Stack Overflow帖子。
我已经写了超过24年的C代码了。反斜杠只是简单的错误 。如果它很重要(实际上它并不是这样,因为Windows很高兴使用正斜杠作为路径分隔符,如果有它们),C编译器就可以对它们进行转换。
答案 1 :(得分:4)
您可能在#include
预处理程序指令中表示与文件名相关的反斜杠。
我们都知道在#include
- d路径中使用反斜杠是错误的
AFAIK没有简单的方法可以将它们神奇地转换为普通(除法)斜杠,因为大多数#include
处理都是关于查询主机操作系统文件系统(通过fopen(3)调用{{3等等....)
(如果你有很多时间可以丢失,你可能会认为脏LD_PRELOAD
技巧超载fopen
等等......我不建议这样做)
您可以更简单地使用open(2)进行更改(例如,在Makefile
中,或者在您自己的$HOME/bin/gcc
脚本中调用真实的/usr/bin/gcc
,并使用合适的{{} 1}} ....)它们出现在$PATH
行中的反斜杠(仅在这些行中)。
查看GCC源代码,它是免费软件,特别是文件sed(1)(处理预处理程序指令);随意修补它以满足您的奇怪需求,并在某处发布补丁!
答案 2 :(得分:2)
GCC并不关心<
指令中>
和#include
之间的内容。它只是将它传递给操作系统。如果您的操作系统找到它,那么GCC会对其进行处理。如果它没有,它就不会。如果您在Linux目录中创建了一个名为foo\bar.h
的文件(可以),并且在源代码中创建了#include "foo\bar.h"
,则会找到该文件。
你可以告诉你的同事推翻他们的傲慢并修复他们破碎的代码。
答案 3 :(得分:2)
没有什么东西无法修复:)
sed -i '/#include/s/\\/\//g' *.c *.h