请考虑以下示例:
#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"
的双引号以类似的方式构造标题吗?有没有办法“转义”双引号字符,所以这样的(最终)指令可以从多个部分构建(不仅仅是一个)?
答案 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:错误:粘贴“/”和“类型”没有给出有效的 预处理令牌