结构体参数传递错误

sam131208
Posts: 15
Joined: Wed Nov 24, 2021 7:21 am

结构体参数传递错误

Postby sam131208 » Mon Aug 15, 2022 9:16 am

你好:
如下所示,当直接传入参数时,编译出错。“error: macro "xQueueSend" passed 5 arguments, but takes just 3”
是否需要设置 -gnu 的编译选项? 怎么设置?我使用的cmd.exe编译方式,没有使用IDE.

xQueueSend(MSGQ, &(struct zView_callback_t){.handle = (zView_callback_handler_t)activity->created, .param1 = va_arg(arg_ptr, void*), .param2 = va_arg(arg_ptr, void*)}, ( TickType_t ) 0);

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 结构体参数传递错误

Postby ESP_Gargamel » Mon Aug 15, 2022 11:57 am

Code: Select all

xQueueSend(MSGQ, (&(struct zView_callback_t){.handle = (zView_callback_handler_t)activity->created, .param1 = va_arg(arg_ptr, void*), .param2 = va_arg(arg_ptr, void*)}), ( TickType_t ) 0);
试一下

sam131208
Posts: 15
Joined: Wed Nov 24, 2021 7:21 am

Re: 结构体参数传递错误

Postby sam131208 » Tue Aug 16, 2022 1:08 am

谢谢,方法可行。
这个代码在zephyr下面是可以编译通过的,也是同样的编译器。 为何在idf下面不可以? 是否还有方法,可以不加括号?

sam131208
Posts: 15
Joined: Wed Nov 24, 2021 7:21 am

Re: 结构体参数传递错误

Postby sam131208 » Tue Aug 16, 2022 2:18 am

是否可以增加一个编译选项 -gnu ? 我的其他代码,都是在-gnu 方式下编写的。可能要修改很多地方。
增加 -gnu 可能是最佳方式。
请告知在哪里可以增加这个选项。


谢谢。

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 结构体参数传递错误

Postby ESP_Gargamel » Tue Aug 16, 2022 9:06 am

idf 里默认 C 用的 -std=gnu99,C++ 用的是 -std=gnu++11,标准是没有问题的。
当前你出现这一问题主要是因为 xQueueSend 是个宏,展开后似乎就不对了。依据 xQueueSend 的定义,你用原始的函数,则不会有此问题。

Code: Select all

xQueueGenericSend(MSGQ, &(struct zView_callback_t){.handle = (zView_callback_handler_t)activity->created, .param1 = va_arg(arg_ptr, void*), .param2 = va_arg(arg_ptr, void*)}, ( TickType_t ) 0, queueSEND_TO_BACK);
同理,在 zephyr 里,你定义一个和 xQueueSend 类似的宏,看是否编译会报错。

sam131208
Posts: 15
Joined: Wed Nov 24, 2021 7:21 am

Re: 结构体参数传递错误

Postby sam131208 » Tue Aug 16, 2022 10:32 am

谢谢你的解惑。
另外一个关于“warning”问题,如下面所示:

cast between incompatible function types from 'void (*)(void *)' to 'int32_t (*)(void *, void *)' {aka 'int (*)(void *, void *)'} [-Wcast-function-type]
.created = (event_callback_handler_t) CreatShuffleSettingView,


".created" 函数原型是 typedef int32_t (*event_callback_handler_t)(void *param1, void *param2)。
实际可能的函数可能是typedef int32 (*event_callback_handler_t)(int a), 或者 typedef void (*event_callback_handler_t)(int a);
在zephyr 下面编译通过,不会有“warning”出现。
我应该怎么修改编译条件?

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: 结构体参数传递错误

Postby ESP_Gargamel » Thu Aug 18, 2022 3:24 am

强制做类型转换了,理论是应该报 warning 的,这个不会影响功能,如果不希望看到这个,可以在工程的 CMakeLists.txt 里加上:

Code: Select all

idf_build_set_property(COMPILE_OPTIONS "-Wno-cast-function-type" APPEND)

Who is online

Users browsing this forum: Google [Bot] and 141 guests