你好:
如下所示,当直接传入参数时,编译出错。“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);
结构体参数传递错误
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 结构体参数传递错误
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);
Re: 结构体参数传递错误
谢谢,方法可行。
这个代码在zephyr下面是可以编译通过的,也是同样的编译器。 为何在idf下面不可以? 是否还有方法,可以不加括号?
这个代码在zephyr下面是可以编译通过的,也是同样的编译器。 为何在idf下面不可以? 是否还有方法,可以不加括号?
Re: 结构体参数传递错误
是否可以增加一个编译选项 -gnu ? 我的其他代码,都是在-gnu 方式下编写的。可能要修改很多地方。
增加 -gnu 可能是最佳方式。
请告知在哪里可以增加这个选项。
谢谢。
增加 -gnu 可能是最佳方式。
请告知在哪里可以增加这个选项。
谢谢。
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 结构体参数传递错误
idf 里默认 C 用的 -std=gnu99,C++ 用的是 -std=gnu++11,标准是没有问题的。
当前你出现这一问题主要是因为 xQueueSend 是个宏,展开后似乎就不对了。依据 xQueueSend 的定义,你用原始的函数,则不会有此问题。
同理,在 zephyr 里,你定义一个和 xQueueSend 类似的宏,看是否编译会报错。
当前你出现这一问题主要是因为 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);
Re: 结构体参数传递错误
谢谢你的解惑。
另外一个关于“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”出现。
我应该怎么修改编译条件?
另外一个关于“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”出现。
我应该怎么修改编译条件?
-
- Posts: 786
- Joined: Wed Nov 14, 2018 8:45 am
Re: 结构体参数传递错误
强制做类型转换了,理论是应该报 warning 的,这个不会影响功能,如果不希望看到这个,可以在工程的 CMakeLists.txt 里加上:
Code: Select all
idf_build_set_property(COMPILE_OPTIONS "-Wno-cast-function-type" APPEND)
Who is online
Users browsing this forum: No registered users and 72 guests