В C _Nonnull универсален, или это какая-то функция расширения компилятора / c99? - PullRequest
0 голосов
/ 02 февраля 2020
const char *const _Nonnull GetString() {
    ...
}

Это кроссплатформенный? Или _Nonnull является либо расширением компилятора, либо функцией c99?

1 Ответ

2 голосов
/ 02 февраля 2020

_Nonnull является расширением поставщика

Токен _Nonnull не является кроссплатформенным или стандартным. Это то, что Apple использовала в своих компиляторах Objective C для запуска дополнительной проверки во время компиляции переменной, объявленной как _Nonnull. Более современные версии языка обновили этот макрос до ключевого слова первого класса.

В этом случае я считаю, что компилятор убедится, что функция не возвращает явно значение NULL-указателя. (Однако это не идеально, поскольку код всегда может неправильно использовать арифметику указателя c для возврата NULL во время выполнения, что компилятор не может обнаружить)

Я никогда не видел, чтобы это использовалось в стандарте C, только когда-либо в старом Objective C.

Эквивалент C99 для параметров функции

Для C99 ключевое слово static может использоваться для принудительного ввода ненулевых входных значений для функций, хотя синтаксис будет сначала вы удивляетесь, что происходит:

int processNonNullString(char myString[static 1])
{
    /* ... */
}

Использование static перед размером массива (1) сообщает компилятору, что myString - это массив символов, по крайней мере 1019 * один элемент. Помните, что массивы - это указатели в C, поэтому это ограничение исключает вероятность того, что указатель будет нулевым.

...