C++ 宏“define function syntax got”;在'之前的预期表达式;{&"x27;代币;

C++ 宏“define function syntax got”;在'之前的预期表达式;{&"x27;代币;,c++,c++11,C++,C++11,我正在使用#define定义一组参数,以便稍后在main()中调用已定义的名称。但是,我在第1行的“{”token”之前得到了“预期表达式。我想知道我的语法是否错误 #define ADV_1M_LEGACY_CONNECTABLE { \ .properties.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED, \ .p_peer_addr = NU

我正在使用
#define
定义一组参数,以便稍后在
main()
中调用已定义的名称。但是,我在第1行的“{”token”之前得到了“
预期表达式。我想知道我的语法是否错误

#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')”标记

更新:

 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*******//
}


所以我想知道我又哪里做错了。你能指导我吗?谢谢你你需要在
C99
中提供一个类型


这是一个。

您需要提供一个类型以及
C99


这是一个。

这太大了,不能作为评论,所以这是一个伪答案

这里是一个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";
}
这不会产生警告(在运行macOS 10.14.2 Mojave的Mac上,使用自制的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
下一步
请将此源代码在您的系统上编译。然后对其进行修补,直到它再现您看到的错误。然后将修改后的代码作为问题的编辑发布。

这太大了,不能作为注释,因此这是一个伪答案

这里是一个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";
}
这不会产生警告(在运行macOS 10.14.2 Mojave的Mac上,使用自制的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
下一步

请将此源代码编译到您的系统上。然后修补它,直到它再现您看到的错误。然后将修改后的代码作为问题的编辑发布。

嗨,我尝试了您的建议。调用它如何。我有一个调用函数:m_adv_handle=advisting_init_common(&m_adv_data,adv_1M_LEGACY_CONNECTABLE);编辑代码后,在此调用行中,我有一个错误“expected expression before')标记。我应该添加(conn_t)当调用它运行时也是如此?使用复合文字是一种方法。另一种方法是作为初始值设定项:
conn\t conn=ADV\u 1M\u LEGACY\u CONNECTABLE;
。你不需要“cast”符号使它作为初始值设定项工作。@Kathleen不。当你运行
gcc-E file.cpp
时,你得到了什么?@okovko我得到了”“;”token“消息前应为表达式。抱歉,我只是初学者。@Kathleen我有一个工作示例可供您查看,我已将其编辑到我的答案中。请确保在
ADV\u 1M\u LEGACY\u CONNECTABLE
之后和
之前有空格(康涅狄格州)
。您好,我尝试了您的建议。如何调用它。我有一个调用函数:m_adv_handle=advisting_init_common(&m_adv_data,adv_1M_LEGACY_CONNECTABLE);编辑代码后,在这个调用行中,我有一个错误“expected expression before”)。我应该添加(conn\t)当调用它运行时也是如此?使用复合文字是一种方法。另一种方法是作为初始值设定项:
conn\t conn=ADV\u 1M\u LEGACY\u CONNECTABLE;
。你不需要“cast”符号使它作为初始值设定项工作。@Kathleen不。当你运行
gcc-E file.cpp
时,你得到了什么?@okovko我得到了“在“;”token“消息之前需要表达式。抱歉,我只是初学者。@Kathleen我有一个工作示例可供您查看,我将其编辑到了我的答案中。请确保在
ADV\u 1M\u LEGACY\u CONNECTABLE
之后和
之前有空格(康涅狄格州)< C/ 99 >使用指定的初始化符号表示-它是无效的C++,即使你找到一个C++编译器接受它,它也可以与<代码>(Apple),Advy1MyLeCyyyAsAddiaby< /Cuff>一起构成复合文字,这也不是C++的一部分。(尽管如此,您可能会发现一个C++编译器接受它,前提是您不把它变成迂腐的“C++ +”模式)。假设它不能工作——重新思考你正在做的事情。或者选择正确的语言——C,而不是C++。@ JonathanLeffler,你的意思是说每个主要的C++编译器都接受它。事实上,如果你找到一个不适用的,我会感兴趣。@未被使用的宏根本不被编译器(预处理器之后)看到。,所以不,这不是一个完整的例子。@okovko:我怀疑G++接受它,我发现Clang++支持G++兼容性并不奇怪。但是,我没有探究哪些编译器接受或不接受它,它仍然“不是标准C++的一部分”(但它是C的一部分)它是C和C++不同语言的另一个领域。给定从您的转录的信息,您需要将宏转换成复合文字。但是,您还需要为<代码>广告> InITIUM()/代码>提供一个声明。(您可以使用3-6个元素,而不是11个)和完整的(您正在使用的结构或类的定义),以及该代码的确切代码和确切错误消息。这就是MCVE()这是一个使用指定的初始化符号的C99构造——即使C++ C++编译器接受它,它也不是有效的。它也可以与<代码>(AuthType)Adv11MyLeCyyyAsXield>代码一起生成复合文字,这也不是C++的一部分。(尽管如此,您可能会发现一个C++编译器接受它,前提是您不把它变成迂腐的“C++ +”模式)。假设它不能工作——重新思考你正在做的事情。或者选择正确的语言——C,而不是C++。@ JonathanLeffler,你的意思是说每个主要的C++编译器都接受它。事实上,如果你找到一个不适用的C++,我会感兴趣。