C 如何连接#定义值?

C 如何连接#定义值?,c,C,我有以下定义 #define ID valve1 #define PROJECT "..\"+ID+"_data_var.h" 当我打印项目时应该给出以下结果 "..\valve1_data_var.h" 这意味着定义PROJECT应该有。\valve1_data_var.h“您通常可以使用##(双数字符号)在宏调用中连接两个令牌 但是,由于字符串文字干扰了已定义的宏,所以只能使用空格,否则可能会遇到无效的预处理标记 另外,你应该避开反斜杠 #define ID "valve1" #de

我有以下定义

#define ID valve1

#define PROJECT "..\"+ID+"_data_var.h"
当我打印
项目时
应该给出以下结果

"..\valve1_data_var.h"

这意味着定义
PROJECT
应该有
。\valve1_data_var.h“

您通常可以使用
##
(双数字符号)在宏调用中连接两个令牌

但是,由于字符串文字干扰了已定义的宏,所以只能使用空格,否则可能会遇到无效的预处理标记

另外,你应该避开反斜杠

#define ID "valve1"

#define PROJECT "..\\" ID "_data_var.h"

C预处理器定义支持令牌连接:

基本上,您使用##而不是+:

#define PROJECT "..\"##ID##"_data_var.h"

乍一看,我也会想到
。它连接标识符以形成更大的标识符:

#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
但在您的情况下,您需要将参数转换为其参数表示形式:

#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
以使其生效

#define PROJECT3(x) # x
#define PROJECT2(x) PROJECT3(x)
#define PROJECT "..\\" PROJECT2(ID) "_data_var.h"
它创建文本
。\\\“valve1”“\u data\u var.h”
,编译器将其视为单个字符串
。\\valve1\u data\u var.h”


#定义ID“valve1”
#定义项目(A,B,C)#A B#C
main()
{
printf(“%s\n”,项目(../ID,_data_var.h));
返回;
}

希望这有帮助

不,它不起作用。。。我得到了“未终止常量的可能真正开始”错误及其打印的“.\”\“\35; ID”\35;“\ u data\u var.h”而不是valve1\u data\u var.h”。我提出了一个与嵌入式c\35;定义项目相关的问题。“ID”\u data\u var.h“为什么在ID之前使用”。。它给出了编译器将如何看待这个问题的“.\\”\valve1“\u data\u var.h”@user3016320查看数据是如何传播的:从
PROJ(ID)
PROJX(valve1)
。当
id
valve1
时,
\id
变成
“valve1”
。我得到了“.\\“valve1”\u data\u var.h”。。。编译器会认为这是…\ValVE1YDATAYVAR。H?*包括“…\\”此外,还包括“.\\”ID“\u data\u var.h”它不起作用。我发现以下错误“#include”预期为“FILENAME”或。。。在这里,我试图包括valve1_data_var.h文件
#include<stdio.h>
#define ID "valve1"

#define PROJECT(A,B,C) #A B #C
main()
{
       printf("%s\n", PROJECT(../,ID,_data_var.h));
       return;
}