У меня есть сотни таких системных вызовов:
char buffer[MAX_LINE_LENGTH];
// ...
sprintf(buffer,"cat cgx_tmp.fbl >> cgx_tmp2.fbl");
system(buffer);
sprintf(buffer,"mv -f cgx_tmp2.fbl %s.fbl", datin);
system(buffer);
sprintf(buffer,"rm -f cgx_tmp.fbl");
system(buffer);
Чтобы исправить код, то есть сделать системные вызовы кроссплатформенными, сотни системных вызовов, специфичных для ОС, таких как mv, rm и cat, можно изменить следующим образом:
#ifdef WIN32
sprintf (buffer, "move /y \"%s\" \"%s.fbb\"", datin, setname );
#else
sprintf (buffer, "mv %s %s.fbb", datin, setname );
#endif
Я просто подумал, что спрошу, прежде чем исправлять код. Приемлем ли описанный выше #ifdef подход? Есть ли передовая практика рассмотрения системных вызовов для ОС Windows или любых других платформ?
Если предпочтение отдается каким-либо другим подходам, было бы здорово, если бы вы привели несколько их примеров. Чтобы я мог использовать их в качестве справочника для своего исправления. Спасибо за вашу помощь.
Обратите внимание: в каждой операционной системе есть системные вызовы, которые выполняют некоторые действия, которые вы делаете. Но, как и команды, которые вы пытаетесь выполнить, они также непереносимы. Если вы хотите работать как с Unix, так и с Unix-подобными системами, а также с Windows, лучше всего создать независимый от платформы API, который вы сможете использовать и который будет делать все грязные вещи с помощью условной компиляции препроцессора. Или найдите существующую кроссплатформенную библиотеку, которая уже сделает все это за вас.
@Someprogrammerdude Верно, спасибо. В этом есть смысл: лучше всего создать независимый от платформы API, который вы сможете использовать и который будет делать все грязные вещи с помощью условной компиляции препроцессора.
Использование system() для переименования/удаления/копирования файлов и т. д. изначально неправильно. Используйте удалить , переименовать и т. д.
@Jabberwocky Доступны ли они и в ОС Windows? Просто перепроверяю...
Вопрос не в «ОС Windows», а в компиляторах, генерирующих код для ОС Windows. Да, оба remove() и rename() доступны в моем древнем компиляторе MS C. Если вы планируете этот проект, вам следует ознакомиться с тем, что доступно, прежде чем начинать работу над проектом.
@Fe2O3 Хорошо, я делаю домашнее задание :)
@Мегидд да, они такие





Это один из обстоятельств, когда я считаю включение C исходных файлов корректным.
Иметь два или более файлов с командами для конкретной системы и включать их.
#if defined(WIN32)
#include "win.c"
#else
#include "linux.c"
#endif
Обратите внимание, что термин «системный вызов» на самом деле относится не к функции
system, а к вызовам уровня ОС. Вызовы операционной системы.