#c #function
Вопрос:
#include<iostream>
using namespace std;
int sum(int ,int);
int sum(int ,int );
int main(){
cout<<sum(1,3)<<endl;
}
int sum(int a,int b){
cout<<"hi "<<endl;
return a b;
}
int sum(int a,int b,char c){
return a b c;
}
В приведенной выше программе я определил функцию после main без объявления прототипа, но компилятор не выдал сообщение об ошибке.
Комментарии:
1. Ты определенно можешь! т
2. Вы можете определять функции в любом нужном вам порядке. Единственное требование состоит в том, чтобы у вас было объявление (или полное определение), прежде чем вы его вызовете
3. Почему ты думаешь, что не можешь?
Ответ №1:
Прототипы не являются строго необходимыми. Функции должны быть объявлены до их использования и определены (где-то), если они используются.
Отдельные объявления позволяют заголовочным файлам объявлять о существовании функции, в то время как другой файл фактически определяет ее (.c, .cpp или даже библиотеку).
Однако, если вы просто реализуете функцию без прототипа, то определение также является ее собственным объявлением. Если он имеет то же имя, что и другая существующая функция с другой сигнатурой, он просто добавляет к набору перегрузки (с этого момента и далее) для этого имени.
Наконец, определение функции, которая не вызывается, не является ошибкой. Подумайте о том, сколько функций объявляется, когда вы включаете <iostream>
то, что вы не вызывали! Неиспользуемые функции не будут отображаться в создаваемом конечном результирующем артефакте.
Проблемы, которые могут возникнуть, возникают, когда вы предоставляете несколько определений для одной и той же функции (ошибка компоновщика) или разные единицы перевода предоставляют разные определения встроенных функций (нарушение одного правила определения (ODR)).
Комментарии:
1. Что вы имеете в виду, говоря «прототипы не являются строго необходимыми»?
2. @Peter-Восстанавливать монику s/строго/всегда ? Я принял «строго» за «всегда», как это может быть.
3. @Peter-RestorateMonica Под этим я подразумевал, что вы можете определить функцию, даже если она ранее не была объявлена. Заголовки со встроенными функциями делают это постоянно. Т. Е. этого не требуется
void f(); void f() { }
, поскольку первый является явным прототипом, а второй-определением. Вы можете простоvoid f() { }
и это его собственная декларация. Если другие файлы хотят вызвать его, а определение функции не видно сразу, то в прототипе будет достаточно информации, чтобы удовлетворить компилятор, а компоновщик найдет/разрешит символ функции позже.