我正在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#character”错误 .
我很感激任何见解!谢谢!
编辑:奇怪的行为
在测试中我发现了以下内容:(注意: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));
但是,如果我执行以下操作,我得到错误“宏'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个参数?
4 回答
这将输出:
稍作修改它也有效:
建议
要么
在调用
IP_ADDRESS_STRING(IP_ADDRESS)
中,显然只有一个参数IP_ADDRESS
,无论如何定义IP_ADDRESS
都是如此,因为参数替换发生 only after 已经识别出调用类函数宏的参数(ISO / IEC 9899) :201X) .在使用定义
#define xstr(a) str(a)
的调用xstr(IP_ADDRESS)
中,根据上面的参数a
然后在扩展宏(宏被替换)之后被一个参数IP_ADDRESS
替换,产生str(192,168,1,1)
,因此str
传递了4个参数 .与第一种情况相反,在函数调用
ipAddressString(IP_ADDRESS)
中,IP_ADDRESS
的替换不会发生,而是 before 识别函数调用的参数 .您可以使用与
xstr()
/str()
一起使用的相同的两阶段技术来使用宏: