dao*_*oad 4 c embedded side-effects 8051 c-preprocessor
我正在研究8051上的每个字节都很重要的项目.因此,我正在使用一些全局变量,而我通常不会这样做.将指针传递给函数的常规方法在这里增加了太多的开销.
我有许多函数使用单个位变量(C的编译器特定扩展)来表示除了正常返回值之外的函数结果.
bit global_error_flag = 0;
bit global_data_ready_flag = 0;
unsigned char A_Function (void) {
// Do some stuff
if ( badness ) {
global_error_flag = 0;
global_data_ready_flag = 1;
return 0;
}
if ( data_is_ready_use ) {
global_data_ready_flag = 1;
}
return a_value;
}
void Other_Function (void) {
unsigned char c;
c = A_Function();
if( global_error_flag) {
// Do error stuff here.
}
else
if( global_data_ready_flag ) {
// Do data processing here.
}
global_error_flag = 0;
global_data_ready_flag = 0;
}
Run Code Online (Sandbox Code Playgroud)
鉴于该技术是邪恶的,有什么方法可以使代码更清晰?
我应该如何最好地指出哪些函数调用会产生设置这些标志的副作用?评论足够吗?我应该命名函数来表明他们的API(准匈牙利式)吗?我应该使用宏来标记此类调用:
#define FUNCTION_SETS_FLAGS(code) (code)
FUNCTION_SETS_FLAGS( c = A_Function() );
Run Code Online (Sandbox Code Playgroud)
还有其他想法吗?
使用一个约定,无论你是否想要称它为"匈牙利语",都是我能想到的最好的方法.在风格上,某种命名前缀优于空#define,至少对我而言.
我认为这实际上很常见.据我所知,S60编程环境在函数上使用了很多传统标签来表示它们会抛出异常.
为了清晰起见,您的全局变量已被标记,这是一个好的开始。
理想情况下,您想要的东西如果出错就无法编译。这意味着宏和注释将不起作用。
我会坚持函数的命名约定 - 不一定是匈牙利语,而是类似A_Function_Returns_Flags, 或者如果你能想到的话就更简洁。
| 归档时间: |
|
| 查看次数: |
732 次 |
| 最近记录: |