Вместо этого вы не можете сделать
handleClick(i){
return (e => {console.log(i)});
}
, попробуйте
handleClick(i){
console.log(i)
}
и переместите обработку события туда, где она вызывается. Таким образом, вместо
<button onClick={this.props.onClick(var)}</button>
Вы хотите попробовать
<button onClick={e => this.props.onClick(var)}</button>
Корректная интерпретация extern
это, Вы говорите что-то компилятору. Вы говорите компилятору, что, несмотря на не присутствование прямо сейчас, объявленная переменная будет так или иначе найдена компоновщиком (обычно в другом объекте (файл)). Компоновщик затем будет удачливым парнем, чтобы найти все и соединить его, были ли у Вас некоторые объявления экстерна или нет.
Избегать воздействия имен (переменные, функции..) за пределами конкретного объекта (файл) необходимо было бы использовать static
.
да, это безопасно. На самом деле я сказал бы, что это - довольно стандартный способ сделать то, что Вы хотите.
Как Вы знаете, это просто означает, что любой.c файл, который включает main.h, также сможет видеть array
и доступ это.
Править
И в C и в C++, присутствии extern
указывает, что первое объявление не является определением. Поэтому это просто делает имя доступным в текущей единице перевода (любой, кто включает заголовок), и указывает, что упомянутый объект имеет внешнюю связь - т.е. доступен через все единицы перевода, составляющие программу. Это не говорит, что объект обязательно расположен в другой единице перевода - просто, что 'эта строка не является определением'.
Редактирование конца
В C, extern
является дополнительным. Без него первое объявление является 'предварительным определением'. Если бы не более позднее определение (который является однозначно определением, потому что оно имеет инициализатор), это рассматривали бы как определение (C99 6.9.2). Как это, это - просто объявление и не конфликтует.
В C++, extern
не является дополнительным - без него, первое объявление является определением (C++ 03 3.1), который конфликтует со вторым.
На это различие явно указывают в Приложении C C++:
"Изменение: C++ не имеет “предварительных определений” как в C
Например, в объеме файла,
int i;
int i;
допустимо в C, недопустим в C++."
Также посмотрите, Как правильно использовать extern
ключевое слово в C.
От компиляции или точки выполнения представления, это не имеет никакого значения.
Однако это потенциально опасно, поскольку это делает массив [] доступным любому другому файлу, какой #includes main.h, который мог привести к содержанию массива [] изменяемый в другом файле.
Так, если массив [] будет только когда-либо использоваться в main.c, удалить строку из main.h и объявить массив [] как статичный в main.c.
Если массив [] будет только использоваться в основном () функция, объявите это там.
Другими словами, массиву [] нужно ограничить его объем самым маленьким.
Экстерн безопасен и корректен. Вы не могли объявить это в заголовке без экстерна.
Как дополнительное, обычно это - лучшая практика для создания макроса или константы для содержания размера массива; в Вашем коде фактический размер (100) появляется дважды в исходной основе. Это было бы более чисто, чтобы сделать это как это:
#define ARRAY_SIZE 100
extern int array[ARRAY_SIZE];
...
int array[ARRAY_SIZE] = { 0 };
Но возможно Вы не хотели включать это во фрагмент кода только ради краткости, поэтому не возьмите преступление :)