我怎样才能#include一个名字是从宏构建的文件?

时间:2009-12-05 16:34:40

标签: c++ c-preprocessor

在跨平台项目中,我想#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)

3 个答案:

答案 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注释和预定义的宏名称永远不会在字符或字符串常量中被识别。 (严格来说,这是规则,不是例外,但无论如何都值得注意。)