如何在GCC中启用反斜杠支持?

时间:2014-07-10 10:48:21

标签: c++ linux gcc compatibility undefined-behavior

我提供了一个应该在GNU / Linux下编译的项目。您可能已经猜到,项目中的所有标题都使用反斜杠符号\

我知道,反斜杠是undefined behavior,但我需要编译它。我很确定有一种方法可以让GCC使用它,因为MinGW版本可以正常使用反斜杠(我只是检查过这个)。

最有趣的是该项目是GNU / Linux的应用程序(对于ARM architecture),并且ARM GCC可能正常工作。我是唯一一个本地使用GNU / Linux并希望将桌面应用程序编译为have an easier debug life的人。

将反斜杠替换为斜杠并迫使同事重新学习使用其他角色不是这样的:我只是一名大三学生,但已经在这里工作了4到7年的同事;他们只是听不到我的声音。所以,我们在这里......

4 个答案:

答案 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