Действительно ли этот экстерн безопасен?

Вместо этого вы не можете сделать

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>
5
задан EvilTeach 9 November 2012 в 02:43
поделиться

6 ответов

Корректная интерпретация extern это, Вы говорите что-то компилятору. Вы говорите компилятору, что, несмотря на не присутствование прямо сейчас, объявленная переменная будет так или иначе найдена компоновщиком (обычно в другом объекте (файл)). Компоновщик затем будет удачливым парнем, чтобы найти все и соединить его, были ли у Вас некоторые объявления экстерна или нет.

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

26
ответ дан 18 December 2019 в 05:15
поделиться

да, это безопасно. На самом деле я сказал бы, что это - довольно стандартный способ сделать то, что Вы хотите.

Как Вы знаете, это просто означает, что любой.c файл, который включает main.h, также сможет видеть array и доступ это.

9
ответ дан 18 December 2019 в 05:15
поделиться

Править

И в 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++."

6
ответ дан 18 December 2019 в 05:15
поделиться
2
ответ дан 18 December 2019 в 05:15
поделиться

От компиляции или точки выполнения представления, это не имеет никакого значения.

Однако это потенциально опасно, поскольку это делает массив [] доступным любому другому файлу, какой #includes main.h, который мог привести к содержанию массива [] изменяемый в другом файле.

Так, если массив [] будет только когда-либо использоваться в main.c, удалить строку из main.h и объявить массив [] как статичный в main.c.

Если массив [] будет только использоваться в основном () функция, объявите это там.

Другими словами, массиву [] нужно ограничить его объем самым маленьким.

1
ответ дан 18 December 2019 в 05:15
поделиться

Экстерн безопасен и корректен. Вы не могли объявить это в заголовке без экстерна.

Как дополнительное, обычно это - лучшая практика для создания макроса или константы для содержания размера массива; в Вашем коде фактический размер (100) появляется дважды в исходной основе. Это было бы более чисто, чтобы сделать это как это:

#define ARRAY_SIZE 100

extern int array[ARRAY_SIZE];

...

int array[ARRAY_SIZE] = { 0 };

Но возможно Вы не хотели включать это во фрагмент кода только ради краткости, поэтому не возьмите преступление :)

4
ответ дан 18 December 2019 в 05:15
поделиться