在C库中以一致的方式处理错误处理错误时,您认为"最佳实践"是什么?
我一直在考虑两种方式:
始终返回错误代码.典型的功能如下所示:
MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize);
Run Code Online (Sandbox Code Playgroud)
始终提供错误指针方法:
int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError);
Run Code Online (Sandbox Code Playgroud)
使用第一种方法时,可以编写这样的代码,其中错误处理检查直接放在函数调用上:
int size;
if(getObjectSize(h, &size) != MYAPI_SUCCESS) {
// Error handling
}
Run Code Online (Sandbox Code Playgroud)
这看起来比错误处理代码更好.
MYAPIError error;
int size;
size = getObjectSize(h, &error);
if(error != MYAPI_SUCCESS) {
// Error handling
}
Run Code Online (Sandbox Code Playgroud)
但是,我认为使用返回值返回数据会使代码更具可读性.很明显,在第二个示例中,某些内容被写入了size变量.
您对我为什么应该选择这些方法或者将它们混合或使用其他方法有任何想法吗?我不是全局错误状态的粉丝,因为它往往会使库的多线程使用更加痛苦.
编辑:只要他们不涉及异常,C++关于此的具体想法也会很有趣,因为目前我不能选择...
我正在尝试为调试打印定义一个类方法,其行为类似于printf:
inline void debug(const char* fmt, ...) __attribute__ ((format (printf, 1, 2)))
Run Code Online (Sandbox Code Playgroud)
这抱怨:
error: format string argument not a string type
Run Code Online (Sandbox Code Playgroud)
我记得类方法声明有一个隐式this参数,所以我将参数的位置更改为2,3:
inline void debug(const char* fmt, ...) __attribute__ ((format (printf, 2, 3)))
Run Code Online (Sandbox Code Playgroud)
现在它编译,但看起来像参数被移位,就好像this参数被视为参数列表的一部分.
如何判断this不属于我要打印的字符串的函数?
一个后续问题:
所以,对于参数,我们使用 @param
@param my_param the quick brown fox takes this parameter over the lazy dog
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用它来引用它@p:
@param my_other_param this is completely different from @p my_param , you know!
Run Code Online (Sandbox Code Playgroud)
现在,对于模板参数,我将替换@param为@tparam. 应该用什么代替@p?
如果将指针传递给只读函数,则该指针是 IN 参数。
如果一个指针被传递给一个只读函数,但是这个函数创建了一个指针的副本,以便在只读操作的模块相关函数中访问它,这个指针仍然是 IN。
如果函数仍然使用指针作为只读,但其他模块相关函数使用指针进行写操作,那么指针是什么?一个 IN 参数,但没有 const?输入/输出参数?
我的意思的例子:
class SteeringWheel {
public: float rotation;
public: SteeringWheel(void) {
this->rotation = 0.f;
}
};
class Car {
private: SteeringWheel *steeringWheel;
public:
/**
* @param[?] steeringWheel Is the steering wheel in or in/out?
*/
Car (SteeringWheel *steeringWheel) {
this->steeringWheel = steeringWheel;
}
/**
* @param[in] degree Steering amount in degrees.
*/
void steer(float degree)
{
this->steeringWheel->rotation += degree;
}
};
int main(int argc, char **argv)
{
SteeringWheel steeringWheel();
/* car() uses …Run Code Online (Sandbox Code Playgroud) 我正在使用STM32F427,我想得到最后一次重置的原因.有RCC时钟控制和状态寄存器RCC_CSR有许多复位标志,但我无法获得任何有意义的值.
通过读取该寄存器的值,我只获得0x03,这意味着LSI就绪并且LSI为ON,但是如果我尝试上电,软件复位,低电压等,则不会设置有关复位的标志.我找到了用于获取复位标志的代码片段如下所示,但所有标志仍为0.
if (RCC_GetFlagStatus(RCC_FLAG_SFTRST)) ...
Run Code Online (Sandbox Code Playgroud)
您有什么建议如何获得更好的结果?在读取这些重置标志之前是否需要一些配置?
谢谢
我正在尝试将压力传感器(MS5803-14BA)与我的电路板(NUCLEO-STM32L073RZ)连接。
根据数据表(第3页),压力传感器需要几毫秒的时间才能准备好读取测量值。对于我的项目,我对转换原始数据大约需要10 ms的最高分辨率感兴趣。
不幸的是,该压力传感器没有任何可用于查看测量准备就绪时间的中断引脚,因此,我暂时解决了在请求新数据后延迟的问题。
我不喜欢当前的解决方案,因为在这10毫秒内,我可以让单片机工作在其他地方(我的板上还连接了其他几个传感器),但是没有任何中断引脚,我不确定这是什么。解决此问题的最佳方法。
我想到了另一个解决方案:使用计时器,该计时器每20秒触发一次,并执行以下操作:
1.a Read the current value stored in the registers (discarding the first value)
1.b Ask for a new value
Run Code Online (Sandbox Code Playgroud)
这样,在下一次迭代中,我只需要读取上一次迭代结束时请求的值即可。
我不喜欢我的测量结果总是20毫秒。直到延迟保持20毫秒,它应该还是可以的,但是如果我需要降低速率,则解决方案的读数“老化”会增加。
您对如何处理还有其他想法吗?
谢谢。
注意:如果您需要查看我当前的实现,请告诉我。