Определение и присвоение указателей на функции в глобальной и локальной области видимости

#c #function-pointers #global #definition #main

#c #функции-указатели #глобальный #определение #программа-точка входа

Вопрос:

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

Большое спасибо

 #include <iostream>
using namespace std;
bool compare(const int amp;v1, const int amp;v2)  {
    if (v1 < v2) { 
        return true;
    } else {
        return false;
    }
}


bool (*pf5)(const int amp;v1, const int amp;v2);
//pf5 = compare;


int main() {
    int v1 = 5;
    int v2 = 6;
    pf5 = compare;

    bool YesNo1 = compare(v1, v2);
    cout << YesNo1 << endl;
    bool YesNo3 =pf5(v1, v2);
    cout << YesNo3 << endl;

    return 1;
}
  

Комментарии:

1. Обычно хорошей идеей является включение ошибки компилятора при публикации о них. Они обычно говорят вам, в чем проблема…

Ответ №1:

Вы не можете выполнять назначения, кроме как внутри функций. Однако вы можете выполнять инициализации:

 bool (*pf5)(const int amp;v1, const int amp;v2) = compare;
  

Комментарии:

1. интересно — это то, чего я не знал. И из моих тестов кажется, что упомянутое вами правило применимо ко всем типам, а не только к указателям на функции. Большое спасибо за ваш ответ. это было намного полезнее, чем я мог надеяться. #включить <iostream> с использованием пространства имен std; int paolo; paolo = 5; int main() { cout << paolo << endl; возвращает 1; }

2. @Random Да, это так. Вы не можете написать какой-либо старый код C где угодно, по вашему желанию — кроме определений и инициализаций, все это должно находиться внутри функции.

3. понял вас. Я уверен, что знание этого позволит избежать многих головных болей в будущем. Еще раз спасибо.

4. @RandomCPlusPlus: int paolo; paolo = 5; работает, потому что paolo = 5; интерпретируется как определение с инициализацией (которая отличается от присваивания). Определение имеет тип по умолчанию int , который согласуется с предыдущим объявлением int paolo; , поэтому конфликта нет. В отличие от этого, bool (*pf5)(const int amp;v1, const int amp;v2); объявляет pf5 указателем на функцию. Тогда pf5 = compare; это определение pf5 как int , поэтому оно несовместимо с предыдущим объявлением.