Если доступен стандартный C, то вы можете сделать это:
#define STRCPY(dst, src) \
_Generic(&(dst), \
char(*)[sizeof(dst)]: strlcpy(dst,src,sizeof(dst)) )
Объяснение:
Вы не можете использовать выражение _Generic
для типа массива, потому что онони один из особых случаев, которые не освобождаются от правила «распада массива» (C17 6.3.2.1 §3).Таким образом, просто используя _Generic((dst), ...
в моем примере, dst
в конечном итоге получит char*
при вычислении выражения, и тогда мы потеряем информацию его первоначального типа.
Но если мы примемадрес массива, используя &
, мы используем один из этих особых случаев, и спад массива не происходит.Вместо этого мы получаем указатель массива, что означает, что _Generic
придется проверить указатель массива ожидаемого типа и размера: char(*)[sizeof(dst)]
.
В качестве примечания / безопасностиЯ никогда не использую макросы do-while(0)
и не поощряю их, но это уже другая история.