2017-08-23 21 views
1

我想用定义如何连接三个定义类型:string + number + string?

#define LOG_FLOAT_MARKER "%s%d.%010d" 

到construnct以下字符串到目前为止,我有

#define EXP (10) 
    #define LOG_FLOAT "%s%d.%0" 
    #define D "d" 

我想创建这样

#define LOG_FLOAT_MARKER LOG_FLOAT EXP D 

一个字符串,但没有得到预期的产出,一些提示?

+0

只能连接*字符串*。 '(10)'不是一个字符串。下一次遇到宏问题时,请让编译器在预处理后停止,以便可以看到它将宏展开为的内容。 –

+0

@Someprogrammerdude谢谢,然后我可以使用'#define EXP 10'来创建字符串,但是我不能将该定义用于数字用法,对吧? – ndarkness

+0

您可能正在寻找'*'说明符[http://en.cppreference.com/w/cpp/io/c/fprintf](http://en.cppreference.com/w/cpp/io/c/fprintf中)。 – ZDF

回答

4

对于EXP,您不能有(10),因为您不希望括号成为结果的一部分。

必须使用字串,以及一些箍跳:

#define EXP 10 

#define JOIN(a, b, c)  a #b c 
#define JOIN2(a, b, c)  JOIN(a, b, c) 
#define LOG_FLOAT_MARKER JOIN2(LOG_FLOAT, EXP, D) 

另外,我觉得使用命名只是D是自找麻烦的预处理器符号。

+0

感谢@unwind,所以最后一步'#define LOG_FLOAT_MARKER JOIN2(LOG_FLOAT,EXP,“d”)'会更好吗? – ndarkness

+1

@ndarkness当然,或者将'D'重命名为其他内容,或者只是对其进行硬编码。 – unwind

+0

嗨@unwind,它似乎不工作,如果我打印'LOG_FLOAT_MARKER'我得到'%s%d。%0(10)d'而不是'%s%d。%010d' – ndarkness

1

我不知道我明白你想要做什么。您可能正在寻找*符:

printf("%s%d.%0*d", "string", 1, 1, 1); // output: string1.1 
printf("%s%d.%0*d", "string", 1, 2, 2); // output: string1.02 
printf("%s%d.%0*d", "string", 1, 3, 3); // output: string1.003 

*一个完整的说明,请参见this

+0

谢谢@ZDF,但我不想使用printf进行优化 – ndarkness

相关问题