在跨平台项目中,我想#include一个头文件,其名称包含平台的名称。我有一个平台的#define宏。
例如,对于
#define PLATFORM win32
我想要
#include "engine\win32\devices_win32.h"
而
#define PLATFORM linux
我想要
#include "engine\linux\devices_linux.h"
我要跟Richard Pennington的回答一样,减去一行代码 - 它对我有用!
#define PLATFORM Linux
#define xstr(x) #x
#define str(x) xstr(x)
#define sub(x) x
#include str(sub(engine/PLATFORM/devices_)PLATFORM.h)
答案 0 :(得分:8)
通常,你会做更多的事情:
#ifdef WIN32
#include "devices_win32.h"
#endif
#ifdef LINUX
#include "devices_linux.h"
#endif
...而不是根据平台可以设置不同的PLATFORM
定义。
答案 1 :(得分:4)
#define PLATFORM Linux
#define xstr(x) #x
#define str(x) xstr(x)
#define sub(x) x
#define FILE str(sub(engine/PLATFORM/devices_)PLATFORM.h)
#include FILE
但是,我不确定我是否会使用它。 ;-)
我不得不使用Linux而不是linux,因为linux在我的编译器中定义为1。
答案 2 :(得分:0)
在实践中,这可以使用
之类的东西来实现#define PLATFORM win32
#define INCLUDE_FILE devices_ ## PLATFORM
#define QUOTED_INCLUDE_FILE #INCLUDE_FILE
#include QUOTED_INCLUDE_FILE
但以下规则会阻止您这样做:
在
#include' directive in which the file name is delimited with
<'中无法识别C注释和预定义的宏名称和`>'。C注释和预定义的宏名称永远不会在字符或字符串常量中被识别。 (严格来说,这是规则,不是例外,但无论如何都值得注意。)