是否有可能粘合"第三种#include指令中的预处理程序标记为双引号?

时间:2014-07-14 20:45:37

标签: c c99 c-preprocessor

请考虑以下示例:

#define HEADER_OPEN  <
#define HEADER_CLOSE >
#define HEADER_PATH  sys/
#define HEADER_FILE  types.h

#include HEADER_OPEN HEADER_PATH HEADER_FILE HEADER_CLOSE

int main(void)
{
    clock_t c;

    return 0;
}

包含<sys/types.h>标头的方式更为冗长。问题是我可以用类似"release/myheader.h"的双引号以类似的方式构造标题吗?有没有办法“转义”双引号字符,所以这样的(最终)指令可以从多个部分构建(不仅仅是一个)?

2 个答案:

答案 0 :(得分:1)

Grzegorz的解决方案几乎是正确的。

#define EXPAND( X ) X
#define STRINGIZE_LITERAL( X ) # X
#define STRINGIZE( X ) STRINGIZE_LITERAL( X )

#define HEADER( PATH, FILE ) STRINGIZE( EXPAND( PATH )FILE )

#include HEADER( sys/, types.h )

EXPAND宏用于避免路径和文件名之间的空格字符。

注意,该标准保证了这一点,但不支持带角度括号的代码,因为在这种情况下,空白处理是特定于实现的。

答案 1 :(得分:0)

我提出的解决方案,几乎可行的是一个workoaround头表达式,由类似函数的宏构建(关键是在末尾应用#运算符):

#define HEADER_PATH sys/
#define HEADER_FILE types.h

#define HEADER_STRINGIZE(x) #x
#define HEADER_REAL(path,file) HEADER_STRINGIZE(path##file)
#define HEADER(path,file) HEADER_REAL(path,file)

#include HEADER(HEADER_PATH, HEADER_FILE) /* the same as "sys/types.h" */

int main(void)
{
    clock_t c;

    return 0;
}

使用gcc -E选项,我看到加载了正确的文件,但是预处理器尝试构造/types.h(运算符##)的标记,这会产生无效标记产生错误:

  

check.c:8:1:错误:粘贴“/”和“类型”没有给出有效的   预处理令牌