Как мне ссылаться на статическую функцию для передачи в качестве параметра?

#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 файл. Это должно сработать.