首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

在函数内部声明函数是不是一个合法但毫无意义的行为呢?该如何处理

2012-04-05 
在函数内部声明函数是不是一个合法但毫无意义的行为呢?比如intmain(){voidswap(int&,int&)//这个声明是合

在函数内部声明函数是不是一个合法但毫无意义的行为呢?
比如int   main()
{
      void   swap(int   &,int   &);     //   这个声明是合法的,
      int   a=3,b=5;
      swap(a,b);
      cout < < "a= " < <a < < "b= " < <b < <endl;
      return   0;
}

虽然声明合法,但是它的使用域仅在main函数内,并不能正确指示main之外的swap(),所以不会调用期望的swap.
    而函数内部定义函数必定非法。参看《C++   program   language》

    那照这样说,在函数内部声明函数是不是一个合法但毫无意义的行为呢?

[解决办法]
定义和声明是不一样的。
[解决办法]
void f()
{
return;
void f2();只声明不定义(它的使用域仅在f()内)
f2();
}

void f2();只声明不定义(它的使用域f2()以后到文件尾).

void f1()
{
f2();
return;
}

void f2()
{
return;
}
[解决办法]

合法且有意义

比如

int main()
{
int n = add(1, 2);


return 0;
}

int add(int x, int y)
{
return x + y;
}

上边这个是编译不过的

但改成这样就可以了


int main()
{
int add(int, int);

int n = add(1, 2);


return 0;
}

int add(int x, int y)
{
return x + y;
}
[解决办法]
在函数内部声明函数是一个合法并有重要意义的行为!例如,有如下程序:

class X
{
public:
void show(int& a,int& b);
};

//把这个函数放于main()之外,和X具有相同的作用域:
void sxwap(int &,int &);

void main(void)
{

int a=3,b=5;
sxwap(a,b);

cout < < "a= " < <a < < " b= " < <b < <endl;

X x;
x.show(a,b); //演示用外部类的成员函数访问sxwap(a,b)函数!

cout < < "a= " < <a < < " b= " < <b < <endl;

_PAUSE;
}

void X::show(int &a,int &b)
{
sxwap(a,b);//可以访问到main()中声明的sxwap(a,b)函数!
}

void sxwap(int& a,int& b)//该定义对于X的成员函数show()不可见!
{
int _t = a;
a = b;
b= _t;
}
注意,重要的是sxwap(int& a,int& b)的定义对于X的成员函数show()不可见!但演示如上程序,一如预期,执行良好。

但如你所述,把 'void sxwap(int &,int &); '语句放于main()中,并且继续确保函数
sxwap(int& a,int& b)的定义对于X的成员函数show()不可见!例如:

class X
{
public:
void show(int& a,int& b);
};

void main(void)
{

//把这个函数放于main()之内:
void sxwap(int &,int &);

int a=3,b=5;
sxwap(a,b);

cout < < "a= " < <a < < " b= " < <b < <endl;

X x;
x.show(a,b); //演示用外部类的成员函数访问sxwap(a,b)函数!

cout < < "a= " < <a < < " b= " < <b < <endl;

_PAUSE;
}

void X::show(int &a,int &b))//该定义对于X的成员函数show()不可见!
{
sxwap(a,b);//生成错误!
}

void sxwap(int& a,int& b)
{
int _t = a;
a = b;
b= _t;
}

演示上述程序,在X类成员函数show()中调用sxwap(a,b)函数将生成编译期错误!这说明通过把sxwap(a,b)函数声明放在main()函数作用域之内,并控制其定义的可见度,可以良好的控制外部函数和外部类对main()函数(当然可以是任意函数)内声明函数的访问!这就是在函数内部声明函数的一个合法并有重要意义的行为!


[解决办法]
stl里有个模板函数也叫swap,这时候void swap(int &,int &); 的声明会让编译器认为swap或许在别的编译单元里有更好的匹配,这种行为是一种un-defined行为,模板函数的匹配在C++标准里介绍的比较复杂,好不容易找到可供参考的条目:


14.6.4.2 Candidate functions
...
If the call would be ill-formed or would find a better match had the lookup within the associated namespaces considered
all the function declarations with external linkage introduced in those namespaces in all translation units, not just
considering those declarations found in the template definition and template instantiation contexts, then the program has
undefined behavior.”
[解决办法]
我对ls的论述不是很明白的说,不过如果把clever101(每日清分)第二个程序中的
using namespace std; 改为using std::cout; using std::endl;
就可以正确链接到自定义的swap函数了。

热点排行