在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++关于此的具体想法也会很有趣,因为目前我不能选择...
我有一个功能的以下Doxygen文档:
/**
@brief Does interesting things
@param[in] pfirst The first parameter: a barrel full of monkeys
@pre
"pfirst" must have been previously passed through BarrelFiller()
*/
Run Code Online (Sandbox Code Playgroud)
请注意,这pfirst是一个参数,并在前提条件中引用它.
我在这里用引号包围它,因为我想从文本的其余部分中脱颖而出.但是这样做会很好,Doxygen会强调命令,最好将它链接到参数定义.有没有办法做到这一点?
如果只使用默认配置(或其微小的改动)就会发生这种情况会特别好.
我已经看到以下两种在C API中声明不透明类型的样式.使用一种风格而不是另一种风格有明显的优势吗?
// foo.h
typedef struct foo * fooRef;
void doStuff(fooRef f);
// foo.c
struct foo {
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud)
// foo.h
typedef struct _foo foo;
void doStuff(foo *f);
// foo.c
struct _foo {
int x;
int y;
};
Run Code Online (Sandbox Code Playgroud) 我试图绕过合作多任务系统的概念,以及它在单线程应用程序中的确切工作方式.
我的理解是,这是一种"多任务处理形式,其中多个任务通过在每个任务内的程序员定义的点上自动将控制权交给其他任务来执行."
因此,如果您有一个任务列表并且一个任务正在执行,那么您如何确定将执行传递给另一个任务?当你将执行恢复到之前的任务时,如何从以前的位置恢复?
我觉得这有点令人困惑,因为我不明白如果没有多线程应用程序可以实现这一点.
任何建议都会很有帮助:)
谢谢
我终于弄明白这一点,想分享知识并节省一些时间,所以请看下面的答案.但是,我仍然需要Linux的答案,所以如果你知道,请回答,因为我的答案中的代码仅适用于Windows.
更新:我也想到了Linux,包括前Python 3.3(例如:Raspberry Pi),我在下面的答案中发布了我的新模块/代码.
我原来的问题:如何在Python中获得毫秒和微秒分辨率的时间戳?我也喜欢类似Arduino的延迟和delayMicroseconds()函数.
几个月前,这个问题被标记为这个问题的副本.看这里:
它说,"这个问题在这里已有答案." 不幸的是,这不是真的.几年前我在问这个问题之前就读过这些答案了,他们没有回答我的问题,也没有满足我的需要.它们和我的问题一样不适用,因为它是最黑的回答,因为它依赖于time模块,因为它依赖于模块,因为它不具有任何类型的保证分辨率,因此它是不可思议的错误:
请重新打开我的问题.它不是重复的.它没有其他问题的事先答案.链接已经包含答案的问题依赖于time模块,甚至表明它的解决方案已经到处都是.最热门的答案是使用16毫秒的答案引用Windows分辨率,这比我在此提供的答案(0.5 美分分辨率)差32000倍.同样,我需要1 ms和1 us(或类似)分辨率,而不是16000 us分辨率.因此,它不是重复的.
谢谢你的时间.:)
我正在使用 STM32F103 芯片,我正在尝试配置和使用其中一个定时器。我使用 STM32CubeMX 生成初始化定时器 2 的代码。我通过调用 HAL_TIM_Base_Start 启动定时器。然后,在循环中,我通过调用 htim2.Instance->CNT 打印出当前计时器值,或者通过调用宏 __HAL_TIM_GetCounter (我相信它只是返回相同的值)。但是,无论我做什么,计数值都显示为零。我也尝试过在开始时调用 __TIM2_CLK_ENABLE() ,但这没有什么区别。
我已经搜索了解决方案,并发现了有关此问题的几个问题,但尚未找到解决方案。
有谁知道我做错了什么?
谢谢。
这是初始化计时器的例程。这段代码是由STM32CubeMX生成的,我没有修改它:
/* TIM2 init function */
static void MX_TIM2_Init(void)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim2.Instance = TIM2;
htim2.Init.Prescaler = 0;
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 0;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != …Run Code Online (Sandbox Code Playgroud) 如何使用arduino上的AnalogRead值填充数组。每一秒arduino都从Analog0读取值,我想将这些读数放入数组。
main在C语言中,像stm32这样的嵌入式系统最基本的函数是:
int main(void) {
int i = 0;
while(1) {
i++;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于i是一个整数,它不会溢出并因此在某些时候产生问题吗?
while(1) i++另外,在等待特定中断时使用相同的策略(使用 )循环是否安全?
编辑:感谢您的所有回答。我很遗憾不知道溢出处理程序与 C 和 C++ 有很大不同。现在我明白了 !