Ошибка компиляции Pebble C TupletCString

У меня возникла проблема с компиляцией моего приложения для часов Pebble. Я пытаюсь отправить строки в скрипт 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

Кто-нибудь замечает в этом что-то плохое?


person med116    schedule 09.03.2014    source источник


Ответы (2)


Ответ @ismail-badavi очень правильный.

Теперь Pebble рекомендует использовать dict_write_cstring.

dict_write_cstring(&iter, SOME_STRING_KEY, string);
person sarfata    schedule 12.03.2014

Ну, это, конечно, неочевидно, но оказывается, это потому, что TupletCString — это макрос, и он расширится до выражения, содержащего email_str ? strlen(email_str) + 1 : 0 в качестве подвыражения, и именно это вызывает ошибку, потому что email_str не может быть нулевым, и поэтому сравнение ничего не дает.

Я нашел эту тему на форумах Pebble с объяснением. Предлагаемое исправление состоит в том, чтобы определить свой собственный макрос, который не имеет условного выражения, например.

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