在C中的以下陈述中哪一个更好用?
static const int var = 5;
Run Code Online (Sandbox Code Playgroud)
要么
#define var 5
Run Code Online (Sandbox Code Playgroud)
要么
enum { var = 5 };
Run Code Online (Sandbox Code Playgroud) 任何人都可以解释我究竟在哪里setjmp(),longjmp()功能可以在嵌入式编程中实际使用?我知道这些是用于错误处理的.但我想知道一些用例.
我有一个功能的以下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) 可能重复:
C代码中的错误处理
假设你有一个功能:
int MightWork(){
// if it works
return x;
// if it fails
return y;
}
Run Code Online (Sandbox Code Playgroud)
x和y应该是什么?
因为我有另一个功能:
if (MightWork){
// do stuff #1
}else{
// do stuff #2
}
Run Code Online (Sandbox Code Playgroud)
我知道对于这个特定的例子,使用返回值1将使第二个代码块"do stuff#1"并且使用返回值0将第二个代码块带到"do stuff#2"
我的问题是C中首选的样式是什么?函数的返回值0表示成功,其他任何值表示失败吗?或相反亦然?或者0以下的值?
我想确保我用当前的样式编写我的C代码.谢谢!
可能重复:
C代码中的错误处理
大家好.我正在使用C进行一些小项目,我知道如何,因为它没有专门的错误处理结构,我必须用额外的条件块污染我的算法.我的问题是你更喜欢如何处理错误,并说明原因.我在两种方式之间挣扎......如果你有第三种方式,发布它.谢谢.
///////////////////////////////////////////
// method 1
// stuff that can go wrong;
if (test1 == failed)
{
// print error;
// exit;
}
else
{
// more stuff that can go wrong;
if (test2 == failed)
{
// print error;
// exit;
}
else
{
// ... and so on...
}
}
///////////////////////////////////////////
// method 2
// stuff that can go wrong;
if (test1 == failed)
{
// print error;
// exit;
}
// more stuff that can go …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)
您有什么建议如何获得更好的结果?在读取这些重置标志之前是否需要一些配置?
谢谢
我正在写我的第一个C库,我不知道该走哪条路.例如,从某些数据存储中检索字符串值的函数可以是:
int get_value(void * store, char ** result);
Run Code Online (Sandbox Code Playgroud)
要么
char * get_value(void * store, int * error);
Run Code Online (Sandbox Code Playgroud)
我很难有任何客观的理由偏爱一个人而不是另一个人,但不止于此,我不会写那么多C.当存在多个输出参数时,返回错误代码看起来会更加一致,但返回值可能更容易使用?不确定.
关于哪种风格更好以及为什么或仅仅是个人偏好,是否存在普遍共识?
我目前正在使用以下语句来获取assert和printf协同工作,有没有更好的方法来做到这一点?
#define ASSERT(x) for(; !(x); assert(x))
#define ALLOC_CHECK(x, ...) ASSERT(x) printf(__VA_ARGS__ "\n");
ALLOC_CHECK(ptr != NULL, "Pointer not initialized");
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毫秒,它应该还是可以的,但是如果我需要降低速率,则解决方案的读数“老化”会增加。
您对如何处理还有其他想法吗?
谢谢。
注意:如果您需要查看我当前的实现,请告诉我。