При переопределении некоторого Libc функции (в «личном» библиотеке проекте моей школы под названием libft
), я получил представление о реализации некоторых как макросы, например, так:Как можно (макросы) libc макросов (GNU/BSD) быть безопасными?
#define ft_isalnum(c) (ft_isalpha(c) || ft_isdigit(c))
#define ft_isalpha(c) (ft_isupper(c) || ft_islower(c))
#define ft_isascii(c) (((c) >= 0) && ((c) <= 0177))
#define ft_isdigit(c) (((c) >= '0') && ((c) <= '9'))
#define ft_islower(c) (((c) >= 'a') && ((c) <= 'z'))
#define ft_isprint(c) (((c) >= 0040) && ((c) <= 0176))
#define ft_isspace(c) ((((c) >= 0x09) && ((c) <= 0x0d)) || ((c) == 0x20))
#define ft_isupper(c) (((c) >= 'A') && ((c) <= 'Z'))
Однако вскоре я узнал, что инструкции например, ft_isspace(s[--len])
нарушается, потому что переменная len
уменьшается в три раза. Поэтому я должен был сделать фактические функции вместо макросов.
Я знаю, что макросы небезопасны. Но я вижу, что реализация libc GNU/BSD в тестах символов is*(3)
- это макросы. Как сделать их макросы безопасными?
Я не допускается (в школе), чтобы использовать функции я не реализованы себя (кроме malloc(3)
, free(3)
, и несколько системных вызовов, таких как write(2)
. И я полагаю, что вызов функции только для проверки ASCII-символ а неэффективный.
Спасибо.
«Мне не разрешено (в школе) использовать функции, которые я сам не реализовал». - Похоже, было бы очень сложно написать любой рабочий код, следуя этому правилу. –
Макросы BSD также не являются «безопасными». Макросов препроцессора нет. –
«Мне не разрешено (в школе) использовать функции, которые я сам не реализовал». - Странно, если школа действительно научит синдрома Inv Invented Here Syndrome. –