为C / C ++编写一个宏#include

时间:2011-07-25 07:48:00

标签: c macros include ibm-midrange

我在AS / 400上工作,有时候是非POSIX。我们还需要在UNIX上编译我们的代码。我们遇到的问题很简单,如#include。

在AS / 400上,我们需要写一下:

#include "*LIBL/H/MYLIB"

在UNIX上,我们需要编写

#include "MYLIB.H"

目前我们在每个C / C ++文件的顶部都有这个(丑陋的)块:

#ifndef IS_AS400
    #include "*LIBL/H/MYLIB"
    /* others here */
#else
    #include "MYLIB.H"
    /* others here */
#endif

我们想要一个统一的宏。这可能吗?我不知道怎么写。

理想情况下,生成的语法为:

SAFE_INCLUDE("MYLIB")
,可在每个平台上正确扩展。

请告知。

3 个答案:

答案 0 :(得分:6)

您只需在每个包含丑陋#include的源文件中#ifndef一个单独的标题。无论如何,这是一种常见的做法。

答案 1 :(得分:5)

您可以将平台的前缀定义为宏。像

#define STRINGY(STR) #STR
#define SAFE_INCLUDE(HDR) STRINGY(HDR)

#ifndef IS_AS400
#define SAFE_INCLUDE(LIB) STRINGY(*LIBL/H/##LIB)
#else
#define SAFE_INCLUDE(LIB) STRINGY(LIB##.H)
#endif

您可以将其用作

#include SAFE_INCLUDE(MYLIB)

答案 2 :(得分:4)

有两种更好的解决方案:

  1. 使用Makefile正确设置编译器查找包含的路径。 对于GCC,您可以添加到CFLAGS -I <path>(您可以多次执行此操作)。
  2. 使用您自己的头文件包装不兼容的库。