首页 文章

Arduino上的Variadic函数

提问于
浏览
1

我正在使用Arduino 022为Arduino Mini Pro编程 . 我有以下功能:

String join(const String str, ...) {
    Serial.println("join");
    va_list args;
    va_start(args, str);

    Serial.println("result init");
    String result = "";

    for (String strArg = str; strArg != NULL; strArg = va_arg(args, String)) {
      Serial.println(result);
      result += strArg + ARG_DELIMITER;
    }

    result = result.substring(0, result.length() - 1);

    Serial.println("join end");

    return result;
  }

当我调用此功能时,程序停止,引脚13中的内置LED亮起 . “join”永远不会打印到串行监视器上 . Arduino上是否不允许使用可变函数?

2 回答

  • 1

    你可以't pass most class types to a variadic function - only POD types (5.2.2 para 7 in the standard); if you do the behaviour is undefined - which could cause the problems you' . 我很确定Arduino String class不是POD,所以这不会起作用 .

    你可能最好使用char数组(至少在某些地方),例如

    String join(char const * const str, ...)
    

    如果这不会在呼叫站点造成太多丑陋,或者可能只为1到N字符串提供重载 .

    另外 - String对象是否可以等于NULL?您对 strArg != NULL 的测试看起来很可疑 .

  • 2

    当你调用代码时,它看起来像:

    join( "foo", "bar", NULL );   // ok
    

    要么:

    join( "foo", "bar" );        // wrong
    

    您必须自己提供NULL终止符 - 编译器不会这样做 .

    编辑:这假设String是char *的typedef(因为你将它与NULL进行比较),但如果是,那么你的代码还有很多其他问题 . 请说明String的类型 .

相关问题