Как инициализировать элемент структуры с возвращением функции?

#c #string #pointers #struct

Вопрос:

Я пытаюсь инициализировать элемент структуры с помощью функции, которая возвращает объединенную строку.

 #include <stdio.h>
#include <string.h>

char* concat(char* dest, char* src) {
    strcat(dest, src);
    return dest;
}

char string1[15] = "hello";
char string2[15] = "world";

typedef struct {
    char* member;
} STATE;

STATE default_state = {
    concat(string1, string2)
};
 

Это сообщение об ошибке :

ошибка: элемент инициализатора не является постоянным

конкат(алфавит, цифры)

Комментарии:

1. educative.io/blog/concatenate-string-c

2. Сообщение об ошибке касается не вашей concat функции как таковой, а того, как вы не можете вызывать функции в инициализаторах глобальных переменных (области действия файла). Либо создайте default_state локальную переменную, либо инициализируйте ее на ранней стадии main , либо инициализируйте ее в строку, известную во время компиляции. Также обратите внимание , что ваша concat функция изменится string1 , поэтому ее использование позже может привести к неожиданностям.

Ответ №1:

Инициализация выполняется и вычисляется во время компиляции. Вы не можете вызвать функцию во время компиляции. Во время компиляции компилятору необходимо знать значение инициализации, но он не может запустить какую-либо функцию.

Либо отложите инициализацию во время выполнения, там вы можете вызвать любую функцию, которую хотите, либо используйте немедленные значения, которые может использовать компилятор.

Например, используя тот факт , что "str1" "str2" обрабатывается объявление "str1str2" , вы могли бы написать этот код :

 #include <stdio.h>
#include <string.h>

char* concat(char* dest, char* src) {
    strcat(dest, src);
    return dest;
}

#define HELLO "hello"
#define WORLD "world"
char string1[15] = HELLO;
char string2[15] = WORLD;

typedef struct {
    char* member;
} STATE;

STATE default_state = {
    HELLO WORLD
};