C++ 处理#包括不同平台上的路径
我正在用NCurses在Arch Linux平台上开发一个软件。它在全局标题中有一个C++ 处理#包括不同平台上的路径,c++,linux,windows,git,ncurses,C++,Linux,Windows,Git,Ncurses,我正在用NCurses在Arch Linux平台上开发一个软件。它在全局标题中有一个#include 我的合作者在Windows中工作,并用Cygwin模拟bash shell。但是,cygwin安装的ncurses库必须使用#include。这是微不足道的改变,但我们的Git历史可能包括一行来回改变多次,如果我们中的一个忘记了这似乎是愚蠢的 是否有某种预处理器检查可以使用适当的路径?正如@BoBTFish所说,您应该在Makefile中指定include路径(每个平台不同)。如果没有,您可以使
#include
我的合作者在Windows中工作,并用Cygwin模拟bash shell。但是,cygwin安装的ncurses库必须使用#include
。这是微不足道的改变,但我们的Git历史可能包括一行来回改变多次,如果我们中的一个忘记了这似乎是愚蠢的
是否有某种预处理器检查可以使用适当的路径?正如@BoBTFish所说,您应该在Makefile中指定include路径(每个平台不同)。如果没有,您可以使用宏
\uuuuucygwin\uuuuuu
(或者\uuuuuuucygwin32\uuuuuuuuu
,不确定哪一个会起作用)来检测您是否正在使用CYGWIN
,如
#ifdef __CYGWIN__
#include <ncurses/ncurses.h>
#else
#include <ncurses.h>
#endif
\ifdef\uuucygwin__
#包括
#否则
#包括
#恩迪夫
有关更多详细信息,请参阅。这应该是makefile(或windows等效文件)的一部分。因此,使用gcc,您可以使用
-I
选项来指定include目录。因此,在一台机器上可以使用-I/path/to/ncurses/include
构建,在另一台机器上可以使用-I/different/ncurses/include/ncurses
,这样您就可以在这两台机器上都使用\include
。请注意,这是获取所有必要的gcc标志(包括路径、库路径等)的好方法,它默认安装在我尝试使用过的每个Linux发行版上。这是GNU autotools设计用来解决的问题类型。与其说是makefile,还不如说是您正在构建的配置。您必须以某种方式配置构建(显然是在构建时)。我的观点是,如果可能的话,这个差异应该在那个级别处理,而不是在代码中处理。当你添加第三个平台时,你也会添加第三个,#ifdef
,对,我同意,我也会在特定的机器上使用-I/path/to/my_ncurses
,只是提供了一个替代方案,以防他们不想调整配置文件。另一方面,有时您必须在Makefile
(或配置文件)本身进行此类检查,但我再次同意,代码应该尽可能保持干净。#ifdef是邪恶的,很难维护。在它所属的makefile/cmake/autotools/scons/…中修复此问题。