Макрос #define Синтаксис функции получил «Ожидаемое выражение перед маркером {{». » - PullRequest
0 голосов
/ 18 января 2019

Я использую #define для определения набора параметров, чтобы я мог просто вызвать определенное имя в main() позже. Тем не менее, я получил «expected expression before '{' token» в строке 1. Интересно, мой синтаксис неправильный.

#define ADV_1M_LEGACY_CONNECTABLE {                                     \
  .properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, \
  .p_peer_addr = NULL,                                                  \
  .interval = APP_ADV_INTERVAL,                                         \
  .duration = APP_ADV_DURATION,                                         \
  .max_adv_evts = 0,                                                    \
  .channel_mask = 0,                                                    \
  .filter_policy = BLE_GAP_ADV_FP_ANY,                                  \
  .primary_phy = BLE_GAP_PHY_1MBPS,                                     \
  .secondary_phy = 0,                                                   \
  .set_id = 0,                                                          \
  .scan_req_notification = 0                                            \
}

Из комментария:

У меня есть вызывающая функция:

m_adv_handle = advertising_init_common(&m_adv_data, ADV_1M_LEGACY_CONNECTABLE);

После редактирования кода в этой вызывающей строке появляется ошибка "expected expression before ')' token".

Обновлен:

 typedef struct
{
 ble_gap_adv_properties_t properties;              
 ble_gap_addr_t const    *p_peer_addr;             
 uint32_t                 interval;                
 uint16_t                 duration;                
 uint8_t                  max_adv_evts;            
 ble_gap_ch_mask_t        channel_mask;            
 uint8_t                  filter_policy;           
 uint8_t                  primary_phy;             
 uint8_t                  secondary_phy;          
 uint8_t                  set_id:4;                
 uint8_t                  scan_req_notification:1; 
 }ble_gap_adv_params_t; //******this being declare in another .h file

 #define ADV_1M_LEGACY_CONNECTABLE (ble_gap_adv_params_t) {               \
  .properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, \
  .p_peer_addr = NULL,                                                  \
  .interval = APP_ADV_INTERVAL,                                         \
  .duration = APP_ADV_DURATION,                                         \
  .max_adv_evts = 0,                                                    \
  .channel_mask = 0,                                                    \
  .filter_policy = BLE_GAP_ADV_FP_ANY,                                  \
  .primary_phy = BLE_GAP_PHY_1MBPS,                                     \
  .secondary_phy = 0,                                                   \
  .set_id = 0,                                                          \
  .scan_req_notification = 0                                          \
 }

 static uint8_t advertising_init_common(ble_gap_adv_data_t* 
  ble_gap_adv_data, ble_gap_adv_params_t adv_params)
 {
  ret_code_t    err_code;
  ble_advdata_t advdata;
  ble_advdata_t srdata;
  uint8_t advHandle;

  ble_uuid_t adv_uuids[] = {{LBS_UUID_SERVICE, m_lbs.uuid_type}};`

  // Build and set advertising data.
   memset(&ble_gap_adv_data->adv_data, 0, sizeof(ble_gap_adv_data->adv_data));

  advdata.name_type          = BLE_ADVDATA_FULL_NAME;
  advdata.include_appearance = true;
  advdata.flags              = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE;

  memset(&srdata, 0, sizeof(srdata));
  srdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]);
  srdata.uuids_complete.p_uuids  = adv_uuids;

  err_code = ble_advdata_encode(&advdata, ble_gap_adv_data->adv_data.p_data, &ble_gap_adv_data->adv_data.len);
APP_ERROR_CHECK(err_code);

err_code = ble_advdata_encode(&srdata, ble_gap_adv_data->scan_rsp_data.p_data, &ble_gap_adv_data->scan_rsp_data.len);
APP_ERROR_CHECK(err_code);


// Set advertising parameters.
err_code = sd_ble_gap_adv_set_configure(&advHandle, ble_gap_adv_data, 
&adv_params);
APP_ERROR_CHECK(err_code);
return advHandle;
}

int main()
{
 m_adv_handle = advertising_init_common(&m_adv_data, 
 ADV_1M_LEGACY_CONNECTABLE); //*********here i have "expected expression before ')' token message*******//
}

enter image description here

Так что мне интересно, где я снова сделал неправильно. Можете направить меня? Спасибо

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Это слишком большой комментарий, поэтому это псевдо-ответ.

Вот приближение к MCVE - со значительной проблемой, что, когда я его компилирую, я не вижу ошибку, которую вы видите.

arm31.cpp

#include <cstdint>

typedef struct
{
    uint32_t    interval;
    uint16_t    duration;
    uint8_t     max_adv_evts;
    uint8_t     secondary_phy;
} ble_gap_adv_params_t;

typedef struct
{
    ble_gap_adv_params_t    adv_params;
    uint16_t                adv_program;
} ble_gap_adv_data_t;

#define ADV_1M_LEGACY_CONNECTABLE (ble_gap_adv_params_t) { \
        .interval = 29,                                    \
        .duration = 31,                                    \
        .max_adv_evts = 0,                                 \
        .secondary_phy = 0,                                \
}

static uint8_t advertising_init_common(ble_gap_adv_data_t *ble_gap_adv_data,
                                       ble_gap_adv_params_t adv_params)
{
    uint8_t advHandle = 19;
    ble_gap_adv_data->adv_params = adv_params;
    ble_gap_adv_data->adv_program = 31963;
    return advHandle;
}

#include <iostream>

int main()
{
    ble_gap_adv_data_t m_adv_data;
    uint8_t m_adv_handle = advertising_init_common(&m_adv_data,
                                                   ADV_1M_LEGACY_CONNECTABLE);
    std::cout
        << "handle:   " << m_adv_handle << ", "
        << "program:  " << m_adv_data.adv_program << ", "
        << "interval: " << m_adv_data.adv_params.interval << ", "
        << "duration: " << m_adv_data.adv_params.duration << ", "
        << "maxadvev: " << m_adv_data.adv_params.max_adv_evts << ", "
        << "secondph: " << m_adv_data.adv_params.secondary_phy << "\n";
}

Компиляция

$ g++ -O3 -g -std=c++11 -Wall -Wextra -Werror -c arm31.cpp
$

Это не выдает предупреждений (на Mac под управлением macOS 10.14.2 Mojave, используя самодельный G ++ 8.2.0). Чтобы получать предупреждения, мне также нужно использовать -pedantic:

$ g++ -O3 -g -std=c++11 -Wall -Wextra -Werror -pedantic -c arm31.cpp
arm31.cpp: In function ‘int main()’:
arm31.cpp:18:9: error: C++ designated initializers only available with -std=c++2a or -std=gnu++2a [-Werror=pedantic]
         .interval = 29,                                          \
         ^
arm31.cpp:39:52: note: in expansion of macro ‘ADV_1M_LEGACY_CONNECTABLE’
                                                    ADV_1M_LEGACY_CONNECTABLE);
                                                    ^~~~~~~~~~~~~~~~~~~~~~~~~
arm31.cpp:19:9: error: C++ designated initializers only available with -std=c++2a or -std=gnu++2a [-Werror=pedantic]
         .duration = 31,                                          \
         ^
arm31.cpp:39:52: note: in expansion of macro ‘ADV_1M_LEGACY_CONNECTABLE’
                                                    ADV_1M_LEGACY_CONNECTABLE);
                                                    ^~~~~~~~~~~~~~~~~~~~~~~~~
arm31.cpp:20:9: error: C++ designated initializers only available with -std=c++2a or -std=gnu++2a [-Werror=pedantic]
         .max_adv_evts = 0,                                       \
         ^
arm31.cpp:39:52: note: in expansion of macro ‘ADV_1M_LEGACY_CONNECTABLE’
                                                    ADV_1M_LEGACY_CONNECTABLE);
                                                    ^~~~~~~~~~~~~~~~~~~~~~~~~
arm31.cpp:21:9: error: C++ designated initializers only available with -std=c++2a or -std=gnu++2a [-Werror=pedantic]
         .secondary_phy = 0,                                      \
         ^
arm31.cpp:39:52: note: in expansion of macro ‘ADV_1M_LEGACY_CONNECTABLE’
                                                    ADV_1M_LEGACY_CONNECTABLE);
                                                    ^~~~~~~~~~~~~~~~~~~~~~~~~
arm31.cpp:22:1: error: ISO C++ forbids compound-literals [-Werror=pedantic]
 }
 ^
arm31.cpp:39:52: note: in expansion of macro ‘ADV_1M_LEGACY_CONNECTABLE’
                                                    ADV_1M_LEGACY_CONNECTABLE);
                                                    ^~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: all warnings being treated as errors

Следующие шаги

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

0 голосов
/ 18 января 2019

Вам необходимо указать тип вместе с составным литералом C99 .

typedef struct conn_s { /*...*/ } conn_t;

#define ADV_1M_LEGACY_CONNECTABLE (conn_t){ /*...*/ }

int main() {
   conn_t conn = ADV_1M_LEGACY_CONNECTABLE;
}

Вот пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...