如何标记带副作用的代码?

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)

还有其他想法吗?

Dan*_*son 6

使用一个约定,无论你是否想要称它为"匈牙利语",都是我能想到的最好的方法.在风格上,某种命名前缀优于空#define,至少对我而言.

我认为这实际上很常见.据我所知,S60编程环境在函数上使用了很多传统标签来表示它们会抛出异常.


Mar*_*som 3

为了清晰起见,您的全局变量已被标记,这是一个好的开始。

理想情况下,您想要的东西如果出错就无法编译。这意味着宏和注释将不起作用。

我会坚持函数的命名约定 - 不一定是匈牙利语,而是类似A_Function_Returns_Flags, 或者如果你能想到的话就更简洁。