我应该包含未使用的参数以保持一致

时间:2014-08-11 16:42:57

标签: c

这个问题可以被抽象为其他编程语言,它更像是礼仪/风格问题。因此,我期待答案中的一些意见。但在回复中,我希望看到为什么一种方法比另一种更清洁的理由。

我有一个有点大的模块。它是专有串行通信协议的解析器。在这个模块中,我有40-50个类似的功能。他们都采取类似的论点。当我收到一个有效的数据包并删除它的所有帧时,我会根据数据包的功能代码调用其中一个功能。

因此,为了论证,这里有一个宣言:

/*!
 * \brief Processes an incoming foo packet and updates the bar data structure
 * \param     data_len Length of the packet's data payload
 * \param[in] p_data   Pointer to the packet's data payload
 */
static bool_t process_foo_response(uint8_t data_len, uint8_t * p_data);

现在,对于某些数据包,我从不希望收到任何数据负载。数据长度始终为0,并且不检查任何有效负载。我对data_len或p_data参数没有任何意图或用途。为了保持一致性,我已将这些参数包含在每个函数的参数列表中,以便所有函数具有相同的公共接口。但这是误导性的 - 最好不要使用那些未使用的参数吗?我无法确定这是否是最干净,最直接的做事方式,或者我是否会在几年后混淆下一位程序员。

当我有一个usused参数时,我通常会在这个

这样的参数列表文档中调用它
/*!
* \param     data_len This packet has no payload, a payload length of 0 is verified.
* \param[in] p_data   This packet has no payload, so no payload will be processed by
                      this function.
*/

我最初希望保留所有参数的一个原因是上游逻辑 - 我正在考虑根据功能代码创建一个具有各种偏移的函数指针列表。这样它就不需要是一个带有参数列表指针的二维数组。但是我的上游逻辑现在只是一个效率很低的交换机/案例(也许有一天我能够证明花时间让它变得更有效率和更高效)但是这种方法非常简单并且很快实现!

2 个答案:

答案 0 :(得分:3)

在严格C中,虽然您可以省略函数声明中的参数名称,但必须在函数 definitions 中具有参数名称。与C ++相比,其中参数名称​​可以在定义中省略。

处理未使用的函数参数的常见做法(因为许多编译器警告未使用的参数)是将参数强制转换为void,通常是通过宏:

#define UNUSED_PARAMETER(p) ((void)(p))

这使"未使用的参数静音#34;警告,但不会产生任何额外的代码。


至于是否省略声明中的名称,我认为这是一种权衡。保留声明中的名称使其与定义保持一致,但是从声明中删除它们有助于强制执行它们未被使用的事实。

答案 1 :(得分:2)

让我烦恼的是额外的参数是有额外的错误空间:当没有参数时,用户无法使用错误的参数调用函数,但是使用被忽略的参数,用户可以传递缓冲区长度为非零,期望发生某些事情,但您的代码仍然会忽略它。

您可以做的一件事是在函数中使用断言,期望有效负载为空,而不是盲目地假设有效负载为零。

你可以做的另一件事就是提供两个独立的功能版本。一个没有参数,一个用于手动使用,一个用于它们,旨在保持一致性。