我在Arduino(1.6.5)环境中编写代码。在我的代码中,我希望能够定义一个字符串值,然后将它和Serial.println()一起使用到串行控制台。
例如:
#define THEVAL 12345 // Define the value
...
v = v + THEVAL; // Use the value in code.
...
Serial.println("The value is: #THEVAL"); // Show the value to user (for debugging)
但是,编译器不会替换引用字符串中的常量。我还尝试了this(C ++ stringification),它表示你将常量放在引用的字符串
#define THEVAL 12345
...
Serial.println("This is the value: " #THEVAL);
但是会产生一个" Stray#字符"编译器中的错误。
我很感激任何见解!谢谢!
编辑:奇怪的行为
在测试中,我发现了以下内容: (注意:IP地址使用逗号分隔八位字节,因为每个八位字节作为单独的参数传递给字节数组中的EthernetServer.begin(byte ip [] = {a,b,c,d})
#define IP_ADDRESS 192,168,1,1
#define IP_ADDRESS_STRING(a,b,c,d) xstr(a)"."xstr(b)"."xstr(c)"."xstr(d)
#define xstr(a) str(a)
#define str(a) #a
如果我执行以下操作,则会收到错误" IP_ADDRESS_STRING需要4个参数,但只有一个参数"
debug("IP Address is: " IP_ADDRESS_STRING(IP_ADDRESS));
但如果我执行以下操作,则会收到错误" macro' str'传递了4个参数,但只需要1"
debug("IP ADDRESS: " xstr(IP_ADDRESS));
但如果我这样做,它就有效:
String ipAddressString(int a, int b, int c, int d)
{
return String(a) + "." + String(b) + "." + String(c) + "." + String(d);
}
debug("IP Address is: " + ipAddressString(IP_ADDRESS));
我很困惑 - 为什么一个宏认为IP_ADDRESS是一个参数,另一个宏认为它是4个参数,而函数正常工作:它看到4个参数?
答案 0 :(得分:1)
#define XSTR(s) STR(s)
#define STR(s) #s
....
#define THEVAL 12345
....
Serial.println("The value of " STR(THEVAL) " is " XSTR(THEVAL));
这将输出:
The value of THEVAL is 12345
答案 1 :(得分:1)
#define XSTR(s) STR(s) #define STR(s) #s .... #define THEVAL 12345 .... Serial.println("The value of " STR(THEVAL) " is " XSTR(THEVAL));
但如果THEVAL设置为123,456,则会失败。
稍作修改也可以:
#define STR(...) #__VA_ARGS__
答案 2 :(得分:0)
建议
Serial.print("This is the value: ");
Serial.println( THEVAL );
或
int x = THEVAL;
Serial.print("This is the value: ");
Serial.println( x );
答案 3 :(得分:0)
我很困惑 - 为什么一个宏认为IP_ADDRESS是单个的 参数,另一个宏认为它是4个参数,而 函数正常工作:它看到4个参数?
在调用IP_ADDRESS_STRING(IP_ADDRESS)
中,显然只有一个参数IP_ADDRESS
,无论IP_ADDRESS
如何定义,都是如此,因为参数替换发生了 仅在 之后才能识别调用类似函数的宏的参数(ISO / IEC 9899:201x)。
在具有定义xstr(IP_ADDRESS)
的调用#define xstr(a) str(a)
中,根据上述内容,参数a
将替换为之后的一个参数IP_ADDRESS
>该宏已已扩展(宏已替换),产生str(192,168,1,1)
,因此str
传递了4个参数。
与第一种情况相反,在函数调用ipAddressString(IP_ADDRESS)
中,IP_ADDRESS
的替换不会发生,而在之前发生函数调用的参数。
您可以使用与xstr()
/ str()
一起使用的相同两阶段技术来使用宏:
#define IP_ADDRESS 192,168,1,1
#define XIP_ADDRESS_STRING(abcd) IP_ADDRESS_STRING(abcd)
#define IP_ADDRESS_STRING(a,b,c,d) xstr(a)"."xstr(b)"."xstr(c)"."xstr(d)
#define xstr(a) str(a)
#define str(a) #a
debug("IP Address is: " XIP_ADDRESS_STRING(IP_ADDRESS));