Кроссплатформенный доступ к константам C

#c #cross-platform #c-preprocessor

#c #кроссплатформенный #c-препроцессор

Вопрос:

Существует ли кроссплатформенный (т.Е. Для Linux, BSD и OS X, в идеале для всех POSIX) Я могу получить программный доступ к константам, например O_RDWR , на основе исключительно строки "O_RDWR" ? Я пишу некоторый (не-C) код, который взаимодействует с функциями C на разных платформах и должен вызывать, например, open(2) с правильными параметрами, но у меня нет гарантии, насколько локальная система устанавливает свои константы.

По сути, я ищу что-то вроде get_constant_value("O_RDWR") -> "02" .

РЕДАКТИРОВАТЬ: в настоящее время у меня есть действительно неприятный хак: прямой вызов препроцессора и проверка выходных данных.

 printf "#include <fcntl.h>nO_RDWR" | cpp | tail -n 1
 

Комментарии:

1. Обычно это делается путем компиляции некоторого кода C на каждой интересующей вас целевой платформе, который сопоставляет целочисленный литерал со строкой, а затем выполняет какой-то поиск. Например, в Python есть константы для них в os модуле , которые определяются через posix модуль в posixmodule.c (посмотрите строку 8992).

Ответ №1:

Нет, на сегодняшний день такого понятия не существует. В C # это называется отражением. Ходят слухи, что комитет C обсуждает отражение для C 14. Как только он будет принят, ну, через 1-3 года, вы можете ожидать, что это будет поддерживаться в компиляторах.

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