(Это дополнительная информация к ответу Джона)
Заголовок C неверен в C ++, поэтому вам придется его изменить.
Возможно, цель [static 1]
означает, что функция не должна вызываться с нулевым указателем. Не существует стандартного способа указать это на обоих языках, и выбор автора не совместим с C ++.
Некоторые основные компиляторы поддерживают __attribute__((nonnull))
на обоих языках, либо как постфикс к каждому параметру, либо как префикс к функции, которая затем применяется ко всем параметрам указателя.
В своем персонализированном заголовке я определяю макрос препроцессора, который расширяется до эквивалентного синтаксиса для каждого компилятора, или не включается для компиляторов, которые его не поддерживают.
Имейте в виду, что требования не требуются компилятор для обеспечения поведения, и, безусловно, будут случаи, когда он этого не делает (например, передает полученный указатель, о котором он ничего не знает).
ИМХО, учитывая текущее состояние отношения компилятора к этой функции (будь то атрибут или static 1
), это следует рассматривать как форму пользовательской документации.
У меня действительно есть решил не использовать его в своем собственном коде, после некоторых экспериментов: использование этого атрибута заставит компилятор оптимизировать любые проверки нулевого указателя в теле функции, что создает возможность ошибок времени выполнения, поскольку нет эффективного предотвращения нулевых указателей проходить Чтобы сделать эту функцию пригодной для использования, компилятору также придется выполнять диагностику каждый раз, когда вызывается функция, и компилятор не может гарантировать, что аргумент не равен нулю. (Это вариант, который я хотел бы видеть в компиляторах, но, насколько я знаю, пока не существует).