Лучший/самый быстрый способ NULL проверить несколько указателей файлов?

Мне было интересно, что было бы лучшим и/или самым быстрым способом проверки NULL нескольких указателей файлов и исключения «плохих» (NULL)? Можно ли этого добиться с помощью оператора switch?

Мой «нормальный/базовый» подход:

FILE *fp1, *fp2, *fp3;

fp1 = fopen(foo, bar);
/* etc.. */

if (!fp1) 
    /* do something */
    return 1;
if (!fp2) 
    return 2;

... 

.. но этот подход кажется слишком длинным, особенно если нужно проверить слишком много указателей. Есть ли трюк, чтобы сделать это более удобно?

Другими словами (или код), что-то вроде этого:

if (!fp1 || !fp2 || !fp3) {
    /* one of the pointers is NULL, let's *somehow* check which one it is */
} else {
    /* everything OK */
} 

Я новичок, и я думал об использовании оператора switch. Чтобы быть более конкретным, я думал (снова) каким-то образом сравнить указатели файлов с NULL, но я не могу понять, как написать такой код, поскольку выражение, используемое в операторе switch, должно быть целым числом, но, с другой стороны, разве NULL не равно 0?

Приношу свои извинения, так как это кажется тривиальным вопросом, но я не смог найти ничего о нулевой проверке множественных указателей, подобных этому.

Заранее спасибо!


person annoyingnoob    schedule 20.12.2019    source источник
comment
Когда вы обнаружите, что создаете несколько объектов с именами thing_N, где N — число, это сильный намек на то, что вам нужен массивFILE *fp[3]. Таким образом, вы можете использовать цикл для проверки - for ( int i = 0; i < 3; i++ ) { if ( !fp[i] ) { /* handle file error */ } }.   -  person John Bode    schedule 20.12.2019
comment
@John Bode Ого, это очень, очень удобно! Большое спасибо за совет!   -  person annoyingnoob    schedule 20.12.2019


Ответы (1)


Нет лучшего способа сделать это. Компилятор с правильной оптимизацией - единственное решение. Switch или if — это одно и то же при компиляции кода.

Только подсказки, если количество открываемых файлов велико, для читаемого кода полезно использовать массив и цикл для его зацикливания. Но если ваша цель — производительность, цикл — не лучший способ сделать это, особенно если количество проверяемых элементов невелико.

person Zig Razor    schedule 20.12.2019