Можно ли проверить, определен ли флаг, не имея предопределенной таблицы поиска и дав в качестве строки только имя флага? - PullRequest
1 голос
/ 17 июля 2011

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

Затем я подумал, что могу позволить пользователям передавать имена флагов в виде строк. Но я не могу найти способ проверить, определен ли макрос, учитывая только строковое имя макроса. Поэтому, если бы пользователь захотел установить флаг FLAG_ABC, он передал бы в качестве аргумента FLAG_ABC, и мне пришлось бы сделать некоторую магию, чтобы проверить, если & FLAG_ABC! = NULL. Это возможно?

1 Ответ

3 голосов
/ 17 июля 2011

Все #define теряются после предварительной обработки. Если вы хотите, чтобы информация о символах препроцессора была доступна во время выполнения, вы должны иметь имена (и, разумеется, значения) этих макросов в виде строк в вашем исполняемом ИЛИ в виде отдельного файла, который вы затем копируете во время выполнения. Я мог бы представить, что было бы неприятно иметь два списка флагов, один с символами # define, другой со строками, а затем вручную заботясь о том, что если вы обновите один, вы также обновите другой без ошибок.

Я бы пошел с отдельным файлом, который вы загружаете во время выполнения, но вместо проблем с обновлением просто укажите, что этот файл будет заголовочным файлом, который вы также #include. В частности, я предлагаю: переместить все ваше определение флага #define's в отдельный заголовочный файл, включить его в свои источники, чтобы вы могли использовать его так, как вы привыкли, создать чтение мини-парсера в файле при запуске. время, то есть разбор каждой строки #define asdf 0xF1A6 в строку и int. Если это работает на практике, и вы хотите предотвратить случайное изменение пользователем этого заголовочного файла, вы можете либо его хэшировать, либо закодировать в двоичном виде.

Альтернативой, с которой вы можете использовать #define -символы в качестве строк на самом деле в вашем двоичном файле, было бы создание .rc -файла из этого заголовочного файла (или как файла заголовка, так и .rc из .csv -файл), а затем с помощью компилятора ресурсов встроить его в секцию .rsrc вашего бинарного файла, вы должны написать вспомогательную программу (которая преобразует файл) и интегрировать вызов этой программы-трансформера в ваш make-скрипт или система сборки всегда должны иметь .rc последнюю версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...