首页 文章

Arduino:如何打印定义常量的值?

提问于
浏览
1

我正在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 回答

  • 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
    
  • 0

    #define XSTR(s)STR(s)
    #define STR(s)#s
    ....
    #define THEVAL 12345
    ....
    Serial.println(“STR(THEVAL)”的值是“XSTR(THEVAL)”;
    但如果THEVAL设置为123,456,则会失败 .

    稍作修改它也有效:

    #define STR(...) #__VA_ARGS__
    
  • 0

    建议

    Serial.print("This is the value: ");
    Serial.println( THEVAL );
    

    要么

    int x = THEVAL;
    Serial.print("This is the value: ");
    Serial.println( x );
    
  • 1

    我很困惑 - 为什么一个宏认为IP_ADDRESS是一个参数,另一个宏认为它是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() 一起使用的相同的两阶段技术来使用宏:

    #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));
    

相关问题