2016-02-05 3 views
0

Я только что начал изучать C++, и я столкнулся с этой концепцией объявления функции. В нем говорится: «функция должна быть объявлена ​​перед использованием», но я написал программу, в которой я прокомментировал объявление функции и использовал эту функцию. Моя программа все еще работает. Я хочу знать, чего я здесь не вижу. Я запускаю эту программу на затмении. Это простая программа, где я передаю ссылку a и b для замены функции и замены значений a и b.C++ программа работает даже без объявления функции перед использованием функции

#include <iostream> 
#include <stdio.h> 
#pragma pack(1) 
using namespace std; 
//void swap(int &,int &); 

int main() 
{ 

int num1,num2; 
cout<<endl<<"Enter two nos\n"; 
cin>>num1>>num2; 
cout<<"\nBefore call\t"<<num1<<"\t"<<num2<<endl; 
swap(num1,num2); 
cout<<"\nAfter call\t"<<num1<<"\t"<<num2<<endl; 
} 
void swap(int &a,int &b) //Saving memory here 
{ 
int c=a; 
a=b; 
b=c; 
} 
+3

'using namespace std;' снова ударяет. –

ответ

1
  • Поскольку в C++ есть предопределенная функция называется swap.
  • Если вы удалите функцию defination, тогда и ваш код будет скомпилирован, потому что компилятор считает это предопределенной функцией.
+0

Да, вы правы. Он использует swap() из пространства имен std. Спасибо за помощь. – Asim

+0

Возможно, «заданная функция» дает впечатление, что функция всегда доступна. Это стандартная библиотечная функция, объявленная в стандартном заголовке библиотеки. Этот заголовок должен быть включен, даже если это косвенно. – juanchopanza

2

Объяснение состоит в том, что один из заголовков, которые вы включили, предоставляет что-то под названием swap().

Некоторые производители, как известно, предоставляют макрос swap() в stdio.h. Проблема заключается в том, что он вызывает разрыв кода при построении с другим компилятором.

Другим возможным объяснением является то, что стандарт C++ предоставляет шаблонную функцию swap() в пространстве имен std, указанном в стандартном заголовке algorithm. С некоторыми реализациями стандартные файлы заголовков включают друг в друга (или предоставляют функции, указанные друг другом). Точно так же код, который опирается на один стандартный заголовок, предоставляющий функции от другого, часто ломается, если вы создаете свой код с другим компилятором, потому что стандарт не требует таких вещей.

Так что попробуйте удалить свое определение swap(). Если ваш код все еще компилирует/links/running, одно из приведенных выше объяснений - по крайней мере, с вашим компилятором и стандартной библиотекой. Другим показателем будет размещение вывода в вашем swap() - если ваш код все еще компилирует/связывает/запускает, но не выводит результат, то это еще один индикатор.

Если вы удалите #include <stdio.h> (вы не используете что-либо стандартное из этого), и ваш код перестанет работать, что укажет на то, какой заголовок является причиной.

+0

Привет, Питер. Как я уже сказал, я прокомментировал #include , а также добавил добавленный вывод в мой swap(). Когда я выполнил программу, числа были заменены, но выходного оператора там не было. Поэтому он использует swap() из «namespace std». Также я заметил, что, когда я использовал объявление, мой swap() был выполнен, так как я мог видеть выходной оператор. Теперь все ясно. Спасибо за помощь – Asim

+0

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

+1

@Asim Это не вопрос реализации, но не включены ли заголовки C++ ('iostream') в заголовок, где объявлен' std :: swap' (заголовок 'utility',' algorithm' для более старых версий C++ '.) – juanchopanza

Смежные вопросы