如何连接#define值?

时间:2014-03-11 08:52:01

标签: c

我有以下定义

#define ID valve1

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

当我打印PROJECT时,它应该给出以下结果

"..\valve1_data_var.h"

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

5 个答案:

答案 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;
}

希望这有帮助