2016-02-05 47 views
0

我刚开始学习C++,并且遇到了这个函数声明的概念。它说“一个函数必须在使用之前声明”,但我已经写了一个程序,我已经评论了函数声明并使用了该函数。我的程序还在工作。 我想知道我在这里失踪。 我在eclipse上运行这个程序。 这是一个简单的程序,我将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 ;' strike again。 –

回答

1
  • 因为在C++中有称为swap预定义的函数。
  • 如果你删除你的函数定义,那么你的代码也会编译,因为编译器认为它是预定义函数。
+0

是的你是对的。它使用名称空间std中的swap()。谢谢您的帮助。 – Asim

+0

也许“预定义功能”给人的印象是功能始终可用。它是标准库函数,在标准库头中声明。即使是间接的,也必须包含该头文件。 – juanchopanza

2

解释是,您包含的其中一个标题是提供了一个名为swap()的标题。

一些供应商以在stdio.h中提供swap()宏而着称。这个问题会导致代码在使用另一个编译器构建时中断。

另一种可能的解释是,C++标准在名称空间std中提供了模板化的swap()函数,在标准标头algorithm中指定。在一些实现中,标准头文件彼此包含(或提供彼此指定的功能)。但是,类似地,如果您使用不同的编译器构建代码,那么依赖于提供其他函数的标准头文件的代码通常会中断 - 因为标准不需要这样的代码。

因此,请尝试删除您的swap()的定义。如果你的代码仍然编译/链接/运行,上面的解释之一就是 - 至少在你的编译器和标准库中。另一个指标是在你的swap()中放置一个输出语句 - 如果你的代码仍然编译/链接/运行,但不产生输出 - 那么这是另一个指标。

如果您删除了#include <stdio.h>(您没有使用任何标准),并且代码停止工作,则会指向哪个标头是原因。

+0

嗨,彼得,正如你所建议的我评论#include ,并且还添加了一个输出语句在我的swap()中,当我执行程序时,数字被交换,但输出语句不存在。所以它使用“namespace std”中的swap()。另外我注意到,当我使用声明时,我的swap()被执行,因为我可以看到输出语句。现在明白了。感谢您的帮助 – Asim

+0

您好,我还有一个疑问。你说如果我在另一个编译器上运行它,代码可能会中断。只是想确认来自不同厂商的不同编译器是否有不同的交换功能实现?这就是代码可能破坏的原因,或者我错了。 – Asim

+1

@Asim这不是实现的问题,但是你包含的C++头文件('iostream')是否间接地包含声明'std :: swap'的头文件('utility'头文件,'algorithm'用于老版本的C++')。 – juanchopanza