2015-11-23 2 views
3

Я понимаю, что это не может быть реальным вопросом. Но я здесь смотрю на мой новый код, который я начинаю писать, и мне было интересно что-то.Временные кодеки без указателей функций в C?

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

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

, например:

|-- module_a 
|-- module_b 
| |-- linux 
| |-- osx 
| `-- windows 
`-- module_c 

Makefile будет звонить в источник из module_b, что это платформа-агностик и module_b/[ОС]/код в зависимости от платформы.

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

Этот второй вариант также перекрывает проблему, с которой мне иногда приходится иметь оптимизированные и неоптимизированные версии (не спрашивать) того же кода и ситуаций, которые похожи. Это привело меня к указателям.

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

Мой новый код будет иметь много из них, поэтому я заранее задаюсь вопросом, есть ли, возможно, третья возможность иметь кодовые файлы, которые являются компилятором (и, возможно, cpu?), Дружественными?

Обратите внимание, что я избегаю использования #ifdefs для этого вообще. Если это имеет значение, я программирую на C99 с gcc 5.2 (и моментальными снимками) на всех трех платформах (да, даже OSX). Поэтому я открыт для расширений.

PS Я пробовал несколько раз программистов.стак, но это призрачный город, к сожалению.

+0

Пожалуйста, не критикуйте другие платформы, которые не могут дать ответ по плохо заданному вопросу. Как вы думаете, кто такой, какой-то оракул? Где код, который заранее вы пытаетесь написать? –

+0

Зачем избегать '# ifdef'? Для вещей, которые можно определить статически, это лучший способ. – Adam

+0

@Adam #ifdefs более или менее то же самое, что я делаю с условными make-файлами, поэтому они не нужны в моем случае. Возможно, избегать не было правильного слова для использования. Не использовать больше, как это. Это не заменит необходимость переконфигурации времени выполнения, которая всегда будет указана в указателях функций. – Keyframe

ответ

0

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

Контроль времени выполнения для поддержки платформы необходим только в том случае, если вы создаете одно и то же изображение для нескольких аппаратных средств (на основе того же процессора, очевидно), и просто настройте его с помощью разных модулей, выбранных во время выполнения. Это позволяет модулю появляться в нескольких разных вариантах, но их можно называть с помощью обычных глобальных вызовов функций, а не косвенно с помощью указателей функций.

+0

Хорошо, но как бы вы могли настроить и выбрать модули/код во время выполнения без указателей функций, используя обычные глобальные вызовы функций? Предположим, что .so/.dll не вариант – Keyframe

+0

Вы бы этого не сделали. * До * времени выполнения вам понадобится некоторый скрипт, чтобы связать эти элементы вместе, чтобы сделать изображение (правильное изображение для данной системной платы или что-то еще). – Kaz