#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
, поэтому оно несовместимо с предыдущим объявлением.