Почему в этом коде есть ошибка компиляции? - PullRequest
3 голосов
/ 11 ноября 2011

Я пытался понять разницу между замыканиями и указателями на функции, и я наткнулся на этот ответ в SO

Что я не понимаю, так это код

BOOL (*lessThanTest)(int);
int lessThan = 100;

lessThanTest = &LessThan;

BOOL LessThan(int i) {
   return i < lessThan; // compile error - lessThan is not in scope
}

Почему возникает ошибка компиляции, учитывая, что lessThan является глобальной переменной, к ней можно получить доступ из функции LessThan, я что-то упустил?

EDIT

Это не мой код, он взят из ответа в SO Указатели функций, замыкания и лямбда

Ответы [ 4 ]

2 голосов
/ 11 ноября 2011

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

Приведенный вами пример кода немного сбивает с толку.Я считаю, что он должен быть внутри функции, а это означает, что lessThan является локальной переменной.Если выход из этой области, но указатель функции все еще существует, тогда в его коде будет ссылка на несуществующую переменную - lessThan.

1 голос
/ 11 ноября 2011

Вы пропустили абзац в этом ответе:

Но теперь я должен передать 2 аргумента при оценке. Если бы я хотел передать указатель этой функции на другую функцию , где lessThan не входил в область действия , мне пришлось бы либо поддерживать его вручную, передавая его каждой функции в цепочке, или продвигая ее в глобальном .

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

0 голосов
/ 11 ноября 2011

В этом коде есть некоторые проблемы:

  • Вы объявляете lessThanTest как указатель неинициализированной функции
  • Вы не можете назначить ему что-то позже в глобальной области действия
  • Вы используете LessThan перед объявлением.
0 голосов
/ 11 ноября 2011

Ну, нет, если lessThan глобально, это не должно приводить к ошибке компиляции, хотя по этому фрагменту вы вряд ли сможете определить, что и где должно быть.lessThanTest=&LessThan; определенно из какой-то локальной области, например.

...