#c #scope #compiler-errors
#c #область видимости #ошибки компилятора
Вопрос:
У меня есть статическая функция callback
:
static SCDynamicStoreCallBack callback( [params] ){ ... }
В main
, я вызываю
createIPAddressListChangeCallbackSCF(callback, manager, amp;storeRef, amp;sourceRef);
Эта функция требует, чтобы функция обратного вызова передавалась в качестве параметра. Однако, когда я пытаюсь скомпилировать, я получаю сообщение об ошибке
error: ‘callback’ was not declared in this scope
callback
объявляется в корне файла. Откуда я должен ссылаться на нее main
?
Комментарии:
1. Объявление / определение
callback()
видноmain()
. Если да, то это должно сработать .2. воспроизведите проблему в крошечной программке. если это само по себе не помогает вам понять, что не так, опубликуйте этот минимальный код, который воспроизводит проблему.
Ответ №1:
Я думаю, проблема в том, что callback() не определен в том же файле, что и main() .
статические функции (и переменные) не отображаются в файлах, даже если есть объявление prototype или extern. Итак, либо callback() должен переместиться в тот же файл, что и main() , либо он должен потерять свою статичность.
Если обе функции находятся в одном файле, сначала должна быть определена либо функция обратного вызова (), либо ее прототип / объявление перед main() .
Комментарии:
1.
callback
было объявлено послеmain
.2. @iammilind Да, я программист на Java, пытающийся писать на C , это не первое или худшее, что пошло не так…
Ответ №2:
Цитирование Википедии:
В языке программирования C static используется с глобальными переменными и функциями, чтобы установить их область действия для содержащего файла. В локальных переменных static используется для хранения переменной в статически выделяемой памяти вместо автоматически выделяемой памяти. Хотя язык не диктует реализацию любого типа памяти, статически выделяемая память обычно резервируется в сегменте данных программы во время компиляции, в то время как автоматически выделяемая память обычно реализуется как стек временных вызовов.
Это означает, что static
функция видна только в объявленном файле. Если это не тот файл, в котором вы вызываете createIPAddressListChangeCallbackSCF
, вы сталкиваетесь именно с этой ошибкой. Попробуйте, удалив static
ключевое слово.
РЕДАКТИРОВАТЬ: также добавьте определение функции где-нибудь в вашем main
.
Комментарии:
1. Я получаю ту же проблему без ключевого слова static.
createIPAddressListChangeCallbackSCF
это вызов библиотеки.2. Попробуйте создать объявление функции, например
SCDynamicStoreCallBack callback( [params] );
, поместить его в свойmain
файл. Это должно сработать.