Я работаю над проектом на 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;
}
Учитывая, что техника злая, есть ли способ сделать код более понятным?
Как лучше всего указать, какие вызовы функций будут иметь побочный эффект от установки этих флагов? Достаточно ли комментариев? Должен ли я назвать функции, чтобы указать их API (квази-венгерский стиль)? Должен ли я использовать макрос для маркировки таких вызовов:
#define FUNCTION_SETS_FLAGS(code) (code)
FUNCTION_SETS_FLAGS( c = A_Function() );
Есть еще идеи?