Обнаружение необъявленного идентификатора перед компилятором - PullRequest
0 голосов
/ 03 октября 2018

Я работаю на многоплатформенной кодовой базе, и на одной из платформ sprintf_s недоступен, но snprintf существует, поэтому в этом случае решение состоит в том, чтобы иметь строку

#define sprintf_s snprintf

Однако я бы хотел либо автоматически отменить это (или выдать ошибку времени компиляции, чтобы я мог сделать это вручную), если платформа реализует sprintf_s.

Я нашел нескольковопросы здесь, чтобы определить, есть ли в классе определенная функция-член (или существует перегрузка оператора потока), но нет для такой функции, как sprintf_s.

(я бы предпочел не использовать ничего экспериментального, ноесли std::experimental::is_detected является единственным решением, пусть так и будет).

Идеальное решение выглядит примерно так:

if !sprintf exists
    #define sprintf_s snprintf

, но что-то вроде следующего также будет приемлемым

static_assert(!sprintf_s_exists, "sprintf_s is now defined");

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Такая проблема (вообще говоря) не редкость.Многие системы решают эту проблему на этапе configure сборки (при создании специфичных для платформы файлов make или ninja).Там вы обычно предоставляете генератору системы сборки небольшое приложение «функционального тестирования», которое либо скомпилируется нормально, либо не компилируется, и вы можете основывать логику системы сборки (обычно, определяя необходимые макросы компилятора) на основе либо

В CMake что-то похожее на вышесказанное называется cmake-compile-features

0 голосов
/ 03 октября 2018

Реализация, которая обеспечивает sprintf_s(), должна определять макрос __STDC_LIB_EXT1__ в <stdio.h>.Вы также можете определить от __STDC_WANT_LIB_EXT1__ до 1, прежде чем включать заголовок самостоятельно.

Вы также можете проверить наличие реализаций, которые вы точно поддерживаете, например MSVC с минимальным номером версии, и включить его условно только дляте.

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

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