C: Возможно передать переменные в функцию, которая запрашивает структуру, поэтому, когда функция вызывается, эти переменные помещаются в структуру? - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть функция, которая запрашивает структуру.

struct test{
    const int a;
    const int b;
};

void testFunction(struct test mytest)
{
    //code
}

Мне было интересно, есть ли способ передать два целых числа в функцию, чтобы процесс вызова обернул эти два целых числа в структуру.

Что-то вроде:

int main()
{
    //function call with some sort of wrapping system...
    testFunction({1,2});
}

Есть ли способ обернуть деталь {1,2} ?

(Если есть ... Может быть также сделано с функциями, которые запрашивают указатель на структуры?)

Заранее спасибо,

Хуан

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

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

void testFunction(const struct test* mytest);

Это можно вызвать с помощью временной структуры, известной как составной литерал в стандартном C. (Аналогично термину анонимные объекты в других языках.)

testFunction(&(struct test){1,2});

, где (struct test){1,2} - составной литерал, и мы берем его адрес для передачифункция.

0 голосов
/ 20 февраля 2019

Функция testFunction, как вы ее объявляете, void testFunction(struct mytest test), может вызываться с помощью:

testFunction((struct mytest) {1,2});

При этом используется составной литерал , который имеет вид:

(type) { initializers... }

Используемый таким образом, он создает временный объект и передает его значение функции.

Для функции, которая принимает указатель на структуру, такую ​​как void testFunction(struct test *mytest), вы можетепередать адрес составного литерала с помощью:

testFunction(& (struct mytest) {1,2});

или:

testFunction((struct mytest []) {1,2});

Время жизни составного литерала внутри функции заканчивается, когда исполняется связанный с ним блок (самый внутренний * 1020)* что приложить это) заканчивается.Он имеет автоматическую продолжительность хранения.

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

0 голосов
/ 20 февраля 2019

Попробуйте:

   #include <stdio.h>

struct test{
     int a;
     int b;
};

void testFunction(struct test *mytest)
{
    printf("a.........:%d",(*mytest).a);
}

int main()
{
    //function call with some sort of wrapping system...
    testFunction(&(struct test){1,2});
}

У меня работает.

...