LINUX.ORG.RU

История изменений

Исправление 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))

Можно еще сделать вариант с размещением на стеке, но лень.