Инициализация структуры языка программирования C/C++?

Только для добавления к тому, что все остальные сказали [приблизительно 113]: Если Вы хотите вызвать функцию с параметром в будущем, необходимо настроить некоторые вызовы анонимной функции.

необходимо передать функцию как аргумент в пользу него, чтобы быть названными позже. В действительности это означает без скобок позади имени. Следующее назовет предупреждение сразу, и это отобразит 'Привет мир':

var a = "world";
setTimeout(alert("Hello " + a), 2000);

Для фиксации этого можно или поставить имя функции (поскольку Flubba сделал), или можно использовать анонимную функцию. Если необходимо передать параметр, то необходимо использовать анонимную функцию.

var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";

, Но если Вы выполняете тот код, Вы заметите, что после 2 секунд во всплывающем окне будет сказано 'Привет Переполнение стека'. Это вызвано тем, что значение переменной измененного за те две секунды. Чтобы заставить его говорить 'Привет мир' после двух секунд, необходимо использовать следующий фрагмент кода:

function callback(a){
    return function(){
        alert("Hello " + a);
    }
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";

Это будет ожидать 2 секунды и затем открывать 'Привет мир'.

12
задан Hamish Smith 10 November 2009 в 01:47
поделиться

5 ответов

Первый оператор создает переменную, инициализированную заданными значениями, т. Е. Эти значения встроены в память и сохраняются непосредственно в исполняемом файле программы по этому адресу переменной (для глобальных объектов) или готовы для копирования в память (для переменных стека).

Второй оператор второго блока сильно отличается. Хотя это выглядит похоже, это выражение присваивания. Это означает, что правая часть оператора равенства является выражением, которое вычисляется (независимо от того, что находится в левой части оператора =), а затем передается оператору =. Без надлежащего контекста {...} не имеет никакого значения.

В C99 вы можете сделать это:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };

Теперь правая часть оператора равенства является допустимым выражением, поскольку там является надлежащим контекстом для компилятора, чтобы узнать, что находится в {...} .

В C ++ 11 синтаксис следующий:

struct_name_id = struct_type_id{ value1, value2, value3 };
22
ответ дан 2 December 2019 в 05:27
поделиться

Я не знаю, почему C изначально не поддерживал какой-то синтаксис для «повторной инициализации» структуры с использованием чего-то вроде списка инициализаторов - определенно бывают случаи, когда я нашел бы это удобным . Как упоминал Джулиано , C99 (и C ++ 0x) в определенной степени исправил это, но мне часто приходится придерживаться C90. Когда я хочу сделать что-то подобное, я иногда делаю следующее:

struct foo const init_foo = { 1, 2, 3};
struct foo myFoo;

// ....

myFoo = init_foo;  // reinitialize myFoo
4
ответ дан 2 December 2019 в 05:27
поделиться

Вам просто нужно привести значения как таковые:

struct_name_id = (struct struct_type_id){ value1, value2, value3 };
2
ответ дан 2 December 2019 в 05:27
поделиться

Будет ли это работать для вас?

typedef struct name_id {int value1; int value2; int value3;} NAME_ID;
name_id mynameid = {0,1,2};
0
ответ дан 2 December 2019 в 05:27
поделиться

Я столкнулся с аналогичной проблемой, и решением было то, что я пытался инициализировать структуру вне функция (не с использованием синтаксиса инициализатора, а с обозначением obj.member = VALUE;). Это связанная проблема, поэтому размещайте здесь сообщения в надежде, что кто-то с тем же вопросом попадет сюда.

0
ответ дан 2 December 2019 в 05:27
поделиться