Pebble C TupletCString编译错误

时间:2014-03-09 23:15:18

标签: pebble-watch pebble-sdk

我有一个问题编译我的卵石watchapp。我正在尝试将字符串发送到手机上的Pebbl eJS脚本中:

Tuplet password_tuple = TupletCString(PASSWORD_KEY, password_str);
Tuplet email_tuple = TupletCString(EMAIL_KEY, email_str); 

编译器错误是:(它们都像这样出错,这只是下面的输出行之一)

./src/app_test.c:84:25: error: the address of 'email_str' will always evaluate as 'true'   [-Werror=address]

email_str和password_str在程序顶部定义,如下所示:

static char email_str[30];
static char password_str[30];
#define PASSWORD_PKEY (int32_t)21
#define EMAIL_PKEY (int32_t)20

有没有人注意到这个有什么问题?

2 个答案:

答案 0 :(得分:3)

@ ismail-badawi的答案非常正确。

Pebble现在建议您使用dict_write_cstring

dict_write_cstring(&iter, SOME_STRING_KEY, string);

答案 1 :(得分:2)

嗯,这当然不是很明显,但结果却是因为TupletCString是一个宏,它会扩展为包含email_str ? strlen(email_str) + 1 : 0作为子表达式的表达式,这就是导致错误的原因,因为email_str不能为空,因此比较没有做任何事情。

我找到了this thread on the Pebble forums的解释。建议的修复方法是定义自己没有条件的宏,例如

#define MyTupletCString(_key, _cstring) \
((const Tuplet) { .type = TUPLE_CSTRING, .key = _key, .cstring = { .data = _cstring, .length = strlen(_cstring) + 1 }})