我有以下定义
#define ID valve1
#define PROJECT "..\"+ID+"_data_var.h"
当我打印PROJECT
时,它应该给出以下结果
"..\valve1_data_var.h"
这意味着定义PROJECT
应该有"..\valve1_data_var.h"
答案 0 :(得分:1)
您通常可以使用##
(双数字符号)在宏调用中连接两个标记。
但是,由于你有字符串文字干扰已经定义的宏,你可以只使用空格,否则你可能遇到无效的预处理令牌。
另外,你应该逃避反斜杠。
#define ID "valve1"
#define PROJECT "..\\" ID "_data_var.h"
答案 1 :(得分:1)
乍一看,我也会想到##
。它连接标识符以形成更大的标识符:
#define CONCATHELP(a,b,c) a##b##c
#define CONCAT3(a,b,c) CONCATHELP(a,b,c)
#define CONCAT2(a,b,c) CONCATHELP(a,,c)
#define STD(what) CONCAT2(std,what)
#define mysink err
...
fprintf(STD(mysink), ...) // prints to stderr
但在您的情况下,您需要the stringifying #
operator将参数转换为其参数的表示形式:
#define mkstr(s) #s
mkstr(foo) // is the same as "foo"
所以在你的情况下,
#define PROJX(id) "..\\" #id "_data_var.h"
#define PROJ(id) PROJX(id)
#define PROJECT PROJ(ID)
可能是一种方法。另一种选择是
#define mkstrX(s) #s
#define mkstr(s) mkstrX(s)
#define PROJECT "..\\" mkstr(ID) "_data_var.h"
做同样的事情,得到
的结果"..\\" "valve1" "_data_var.h"
反过来,被编译器理解为组件的串联。
需要额外的间接级别来帮助成为ID
映射到valve1
才能生效。
答案 2 :(得分:0)
C预处理器定义支持令牌连接:
http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html
基本上,您使用##而不是+:
#define PROJECT "..\"##ID##"_data_var.h"
答案 3 :(得分:0)
#define PROJECT3(x) # x
#define PROJECT2(x) PROJECT3(x)
#define PROJECT "..\\" PROJECT2(ID) "_data_var.h"
它创建了文字"..\\" "valve1" "_data_var.h"
,编译器将其视为单个字符串"..\\valve1_data_var.h"
。
答案 4 :(得分:0)
#include<stdio.h>
#define ID "valve1"
#define PROJECT(A,B,C) #A B #C
main()
{
printf("%s\n", PROJECT(../,ID,_data_var.h));
return;
}
希望这有帮助