Как сделать системные вызовы кроссплатформенными: удобство обслуживания и лучшие практики

У меня есть сотни таких системных вызовов:

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 или любых других платформ?

Если предпочтение отдается каким-либо другим подходам, было бы здорово, если бы вы привели несколько их примеров. Чтобы я мог использовать их в качестве справочника для своего исправления. Спасибо за вашу помощь.

Обратите внимание, что термин «системный вызов» на самом деле относится не к функции system, а к вызовам уровня ОС. Вызовы операционной системы.

Some programmer dude 13.09.2023 08:15

Обратите внимание: в каждой операционной системе есть системные вызовы, которые выполняют некоторые действия, которые вы делаете. Но, как и команды, которые вы пытаетесь выполнить, они также непереносимы. Если вы хотите работать как с Unix, так и с Unix-подобными системами, а также с Windows, лучше всего создать независимый от платформы API, который вы сможете использовать и который будет делать все грязные вещи с помощью условной компиляции препроцессора. Или найдите существующую кроссплатформенную библиотеку, которая уже сделает все это за вас.

Some programmer dude 13.09.2023 08:17

@Someprogrammerdude Верно, спасибо. В этом есть смысл: лучше всего создать независимый от платформы API, который вы сможете использовать и который будет делать все грязные вещи с помощью условной компиляции препроцессора.

Megidd 13.09.2023 08:20

Использование system() для переименования/удаления/копирования файлов и т. д. изначально неправильно. Используйте удалить , переименовать и т. д.

Jabberwocky 13.09.2023 09:24

@Jabberwocky Доступны ли они и в ОС Windows? Просто перепроверяю...

Megidd 13.09.2023 09:52

Вопрос не в «ОС Windows», а в компиляторах, генерирующих код для ОС Windows. Да, оба remove() и rename() доступны в моем древнем компиляторе MS C. Если вы планируете этот проект, вам следует ознакомиться с тем, что доступно, прежде чем начинать работу над проектом.

Fe2O3 13.09.2023 10:05

@Fe2O3 Хорошо, я делаю домашнее задание :)

Megidd 13.09.2023 10:11

@Мегидд да, они такие

Jabberwocky 13.09.2023 10:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это один из обстоятельств, когда я считаю включение C исходных файлов корректным.

Иметь два или более файлов с командами для конкретной системы и включать их.

#if defined(WIN32)
#include "win.c"
#else
#include "linux.c"
#endif

Другие вопросы по теме