这似乎是一个简单的问题,但我无法通过Stack Overflow搜索或Google找到它.什么类型后跟一个_t意思?如
int_t anInt;
Run Code Online (Sandbox Code Playgroud)
我在C代码中看到很多意味着与硬件紧密相关 - 我不禁认为它们是相关的.
在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++关于此的具体想法也会很有趣,因为目前我不能选择...
这个问题实际上是不久前在programming.reddit.com 上进行有趣讨论的结果.它基本归结为以下代码:
int foo(int bar)
{
int return_value = 0;
if (!do_something( bar )) {
goto error_1;
}
if (!init_stuff( bar )) {
goto error_2;
}
if (!prepare_stuff( bar )) {
goto error_3;
}
return_value = do_the_thing( bar );
error_3:
cleanup_3();
error_2:
cleanup_2();
error_1:
cleanup_1();
return return_value;
}
Run Code Online (Sandbox Code Playgroud)
goto这里的使用似乎是最好的方法,导致所有可能性中最干净,最有效的代码,或者至少在我看来.在Code Complete中引用Steve McConnell :
goto在分配资源,对这些资源执行操作,然后释放资源的例程中很有用.使用goto,您可以清理代码的一部分.goto可以降低忘记在检测到错误的每个位置释放资源的可能性.
此方法的另一个支持来自本节中的" Linux设备驱动程序"一书.
你怎么看?这种情况goto在C中是否有效?您是否更喜欢其他方法,这些方法会产生更复杂和/或效率更低的代码,但是要避免goto?
我查看了一些代码并发现惯例是将指针类型转换为
SomeStruct*
Run Code Online (Sandbox Code Playgroud)
成
typedef SomeStruct* pSomeStruct;
Run Code Online (Sandbox Code Playgroud)
这有什么好处吗?
所以这可能是一个很长的镜头,但有没有办法将C或C++文件作为脚本运行?我试过了:
#!/usr/bin/gcc main.c -o main; ./main
int main(){ return 0; }
Run Code Online (Sandbox Code Playgroud)
但它说:
./main.c:1:2: error: invalid preprocessing directive #!
Run Code Online (Sandbox Code Playgroud) 在最近的讨论(见评论这个答案),R ..建议不要为了指针-TO-别名const类型,你将不能够很容易地解除分配在标准的C程序中引用的对象(记住:free()需要一个非- const指针参数和C99 6.3.2.3仅允许从不合格到合格的转换)。
C语言显然假定存在任何已分配对象的所有者,即某人必须存储const指向该对象的非指针,而该人负责释放。
现在,考虑一个用于分配和初始化对象的库,这些对象不能通过用户空间代码进行修改,因此函数调用始终返回const合格的指针。
显然,库是对象的所有者,应该保留一个非const指针,这有点愚蠢,因为用户已经提供了一个完全有效的,但是const在每次库调用时都复制了指针的副本。
为了取消分配这样的对象,库必须丢弃const限定符;否则,必须取消限定符。据我所知,以下
void dealloc_foo(const struct foo *foo)
{
free((void *)foo);
}
Run Code Online (Sandbox Code Playgroud)
有效的C; 仅当foo参数另外被restrict限定时才无效。
但是,抛弃const似乎有点乱。
除了从const库函数的所有返回值中删除之外,还有其他方法会丢失有关对象可变性的任何信息吗?
我一直在阅读SO,并遇到了以下问题,这些问题涉及为什么typedefing指针类型不好.
不透明的C结构:它们应该如何声明? 和 Const-correctness和不可变的分配对象
我想知道是否有人可以扩展并解释为什么typedefing指针类型很糟糕,并且可能提供一些可能发生错误的示例.
另外,如果typedefing指针类型确实是禁忌,那么为什么Win32 API会这样做呢?在Win32 HANDLE(和有效的句柄类型)中,typedef为a void *.
我正在尝试将压力传感器(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毫秒,它应该还是可以的,但是如果我需要降低速率,则解决方案的读数“老化”会增加。
您对如何处理还有其他想法吗?
谢谢。
注意:如果您需要查看我当前的实现,请告诉我。
我可以在许多书籍和其他有关SO的问题中读到,该标准可能会扩展标识符集,例如size_t或int32_t,因此它保留了_t对标识符后缀的任何使用。
真的吗?
我找不到在ISO9899:1999标准中妨碍使用此后缀的任何内容,但该标准很难阅读:(
我应该根据头文件和一些进一步的描述来制作一个程序。需要解决不透明类型的问题。不透明结构在头文件中与一些其他函数一起声明。但每个函数都应该有自己的 .c 文件,问题就来了。我应该做什么或者应该在哪里定义不透明结构以便我的函数可以使用它?
我有这样的文件:
header.h source.c(main) function1.c function2.c 等
在这种情况下我不知道该怎么办。
c ×12
c++ ×4
pointers ×4
typedef ×2
const ×1
conventions ×1
goto ×1
interrupt ×1
multitasking ×1
oop ×1
polymorphism ×1
pressure ×1
shell ×1
stm32 ×1
terminology ×1
types ×1