C 未被调用而强制转换为void的函数指针

C 未被调用而强制转换为void的函数指针,c,syntax,embedded,compiler-optimization,C,Syntax,Embedded,Compiler Optimization,在阅读一些STM32中间件代码时,我遇到了这行非常奇怪的代码,无法解析它。基本上是 (无效)(foo); 这不是一个空指针类型转换-这很简单。它没有调用函数并将其返回值强制转换为void,这需要更多的括号。它看起来像一个没有左值的右值。这仅仅是为了防止函数被优化而没有操作吗?或者它真的有什么作用 这里是上下文 //SVCCTL\u EvtAckStatus\t只是一个枚举typedef typedef svctl_EvtAckStatus_t(*SVC_CTL_p_EvtHandler_t)(

在阅读一些STM32中间件代码时,我遇到了这行非常奇怪的代码,无法解析它。基本上是

(无效)(foo);
这不是一个空指针类型转换-这很简单。它没有调用函数并将其返回值强制转换为void,这需要更多的括号。它看起来像一个没有左值的右值。这仅仅是为了防止函数被优化而没有操作吗?或者它真的有什么作用

这里是上下文

//SVCCTL\u EvtAckStatus\t只是一个枚举typedef
typedef svctl_EvtAckStatus_t(*SVC_CTL_p_EvtHandler_t)(void*p_evt);
void SVCCTL_RegisterCltHandler(SVC_CTL_p_EvtHandler_t pfBLE_SVC_Client_Event_Handler)
{
#如果(BLE\U CFG\U CLT\U MAX\U NBR\U CB>0)
//忽略这一切
svctl_CltHandler.svctl_CltHandler表[svctl_CltHandler.NbreOfRegisteredHandler]=pfBLE_SVC_客户端事件处理程序;
SVCCTL_CltHandler.NbreOfRegisteredHandler++;
#否则
//这是奇怪的东西
(无效)(pfBLE_SVC_客户端_事件处理程序);
#恩迪夫
返回;
}

除了一件事,它什么都不做。停止编译器抱怨未使用的变量。事实上,这里建议将其作为一种便携方式:

例如:

intsomefunction(inta,intb,intc)
{
(void)(c);//c保留供将来使用,
//停止编译器发出“未使用参数”警告
返回a+b;
}
这是做什么的:

(void)(foo);
将表达式
foo
强制转换为type
void
。这是一种表示表达式未被显式使用的方式

如果查看函数
SVCCTL\u RegisterCltHandler
的定义,您将看到它接受一个名为
pfBLE\u SVC\u Client\u Event\u Handler
的参数。此参数用于
#if
预处理器块。如果
#If
条件为false,则此参数将未使用,并且编译器将发出警告,提示参数
pfBLE_SVC_Client_Event_Handler
未使用


通过在
#else
块中将此参数强制转换为
void
,它将使用该值并使编译器警告静音。

这是为了防止编译器抱怨foo未使用。确实如此。这就像C++中的<代码> MyBeYunUng/Ungult>属性。< /P>你有没有引用“代码> ScCycTpLeVthHythLeLyt ?这可能有助于解决此查询。我认为这里有一个答案:。虽然这个问题是针对C++的,我认为答案也适用于C。我猜想(1)行本身是用来抑制关于<代码> pfLeBysVCcliclitEngEnter处理程序< /代码>的警告,并且(2)@ @ Ogurar建议,<代码>(空隙)< /代码>有抑制其他警告。它将表达式
(foo)
强制转换为type
void