История изменений
Исправление forCe, (текущая версия) :
А где велосипед? Давай уж, тоже опозорься каким-нибудь страшным кодом.
Я не Xellos, но это для всех обязательно?
Тогда нате мой(надеюсь, что хоть немного оригинален):
char *strct_impl(const char *s1, size_t sz1, const char *s2, size_t sz2)
{
char *buf = malloc(sz1 + sz2 + 1);
memcpy(buf, s1, sz1);
memcpy(buf + sz1, s2, sz2 + 1);
return buf;
}
#define strsz(s) _Generic((&s), \
char **: strlen(s), \
const char **: strlen(s), \
default: sizeof(s) - 1)
#define strct(s1, s2) \
strct_impl(s1, strsz(s1), s2, strsz(s2))
Можно еще сделать вариант с размещением на стеке, но лень.
Исходная версия forCe, :
А где велосипед? Давай уж, тоже опозорься каким-нибудь страшным кодом.
Я не Xellos, но это для всех обязательно?
Тогда нате мой(надеюсь, что хоть немного оригинален):
char *strct_impl(const char *s1, size_t sz1, const char *s2, size_t sz2)
{
char *buf = malloc(sz1 + sz2 + 1);
memcpy(buf, s1, sz1); \
memcpy(buf + sz1, s2, sz2 + 1);
return buf;
}
#define strsz(s) _Generic((&s), \
char **: strlen(s), \
const char **: strlen(s), \
default: sizeof(s) - 1)
#define strct(s1, s2) \
strct_impl(s1, strsz(s1), s2, strsz(s2))
Можно еще сделать вариант с размещением на стеке, но лень.