C++不允许函数嵌套定义!(或C++不允许在main函数定义中定义函数)

今天编写程序遇到了一个奇怪的bug,场景可以概括为“我在main函数中定义了函数,并且调用,看起来没有任何问题但是怎么改都不行”。
出问题的代码是这样的:

#include <iostream>
#include <vector>
using namespace std;

void out_vector(vector<int> &vec)//构造函数打印数组,方便验证
{
  for(vector<int>::iterator it=vec.begin();it<vec.end();it++)
  cout<<*it<<" ";
  cout<<endl;
}

int main()
{
  vector<int> v1;
  for(int i=0;i<5;i++)//创建道具v1并给其插入元素,为之后验证服务
  v1.push_back(i+1);
  out_vector(v1);//打印验证,第1行应输出1 2 3 4 5

  vector<int> v2;
  v2=v1;//赋值方法1:重载等号运算符
  out_vector(v2);//打印验证,第2行应输出1 2 3 4 5

  vector<int> v3;
  v3.assign(v2.begin()+1,v2.end()-1);//赋值方法2:区间数据拷贝赋值
  out_vector(v3);//打印验证,第3行应输出2 3 4

  vector<int> v4;
  v4.assign(4,3);//赋值方法3:若干个数据拷贝赋值
  out_vector(v4);//打印验证,第4行应输出3 3 3 3

  void test1()//探索区间赋值是否是完全覆盖行为
  {
    v2.assign(v4.begin(),v4.begin()+3);
    //如果赋值行为是完全覆盖自身,应输出3 3 3
    out_vector(v2);//打印验证
  }

  void test2()//探索若干数据拷贝赋值是否是完全覆盖行为
  {
    v3.assign(5,0);
    //如果赋值行为是完全覆盖自身,应输出0 0 0 0 0
    out_vector(::v3);//打印验证
  }

  cout<<"调用test1的结果:"<<endl;
  test1();
  cout<<"调用test2的结果:"<<endl;
  test2();

  return 0;
}

编译器报错信息:error:a function-definition is not allowed here before ‘{’
token
我检查了标点符号的中英文状态,没有问题,各种检查,都找不出问题,上网一查,才知道这句报错的意思是:不允许函数嵌套定义。即是说不允许在main函数的定义中出现其他函数的定义。
只是不能出现定义,那能不能先在main函数中声明函数,再在main函数之后完成定义呢?修改代码如下:

#include <iostream>
#include <vector>
using namespace std;

void out_vector(vector<int> &vec)//构造函数打印数组,方便验证
{
  for(vector<int>::iterator it=vec.begin();it<vec.end();it++)
  cout<<*it<<" ";
  cout<<endl;
}

int main()
{
  void test1();//先行声明
  void test2();

  vector<int> v1;
  for(int i=0;i<5;i++)//创建道具v1并给其插入元素,为之后验证服务
  v1.push_back(i+1);
  out_vector(v1);//打印验证,第1行应输出1 2 3 4 5

  vector<int> v2;
  v2=v1;//赋值方法1:重载等号运算符
  out_vector(v2);//打印验证,第2行应输出1 2 3 4 5

  vector<int> v3;
  v3.assign(v2.begin()+1,v2.end()-1);//赋值方法2:区间数据拷贝赋值
  out_vector(v3);//打印验证,第3行应输出2 3 4

  vector<int> v4;
  v4.assign(4,3);//赋值方法3:若干个数据拷贝赋值
  out_vector(v4);//打印验证,第4行应输出3 3 3 3


  cout<<"调用test1的结果:"<<endl;
  test1();
  cout<<"调用test2的结果:"<<endl;
  test2();

  return 0;
}

//main函数后完成定义
  void test1()//探索区间赋值是否是完全覆盖行为
  {
    v2.assign(v4.begin(),v4.begin()+3);
    //如果赋值行为是完全覆盖自身,应输出3 3 3
    out_vector(v2);//打印验证
  }

  void test2()//探索若干数据拷贝赋值是否是完全覆盖行为
  {
    v3.assign(5,0);
    //如果赋值行为是完全覆盖自身,应输出0 0 0 0 0
    out_vector(v3);//打印验证
  }

编译之后还是报错:error:‘v2’ was not declared in this scope
这句话的意思就是该函数作用域下没有定义v2。因为test1和test2的作用域仅仅只是它们定义之处的{}内,所以无法直接访问main函数里定义的变量。
所以需要把函数改成有参的。随后我意识到我会犯这个错误是因为两个误区:1.以为main函数里定义的全局变量;2.受到“类”的诱导,以为函数声明在main内就可以直接访问main内的变量(因为在类的成员函数可以直接访问类内成员)。
修改后代码如下:

#include <iostream>
#include <vector>
using namespace std;

void out_vector(vector<int> &vec)//构造函数打印数组,方便验证
{
  for(vector<int>::iterator it=vec.begin();it<vec.end();it++)
  cout<<*it<<" ";
  cout<<endl;
}

int main()
{
  void test1(vector<int> &v2,vector<int> &v4);
  void test2(vector<int> &v3);

  vector<int> v1;
  for(int i=0;i<5;i++)//创建道具v1并给其插入元素,为之后验证服务
  v1.push_back(i+1);
  out_vector(v1);//打印验证,第1行应输出1 2 3 4 5

  vector<int> v2;
  v2=v1;//赋值方法1:重载等号运算符
  out_vector(v2);//打印验证,第2行应输出1 2 3 4 5

  vector<int> v3;
  v3.assign(v2.begin()+1,v2.end()-1);//赋值方法2:区间数据拷贝赋值
  out_vector(v3);//打印验证,第3行应输出2 3 4

  vector<int> v4;
  v4.assign(4,3);//赋值方法3:若干个数据拷贝赋值
  out_vector(v4);//打印验证,第4行应输出3 3 3 3


  cout<<"调用test1的结果:"<<endl;
  test1(v2,v4);
  cout<<"调用test2的结果:"<<endl;
  test2(v3);

  return 0;
}

  void test1(vector<int> &v2,vector<int> &v4)//探索区间赋值是否是完全覆盖行为
  {
    v2.assign(v4.begin(),v4.begin()+3);
    //如果赋值行为是完全覆盖自身,应输出3 3 3
    out_vector(v2);//打印验证
  }

  void test2(vector<int> &v3)//探索若干数据拷贝赋值是否是完全覆盖行为
  {
    v3.assign(5,0);
    //如果赋值行为是完全覆盖自身,应输出0 0 0 0 0
    out_vector(v3);//打印验证
  }

运行结果:
在这里插入图片描述总结:
1.函数不能嵌套定义,但可以在函数中声明函数,在函数外定义函数;
2.在函数中声明的函数的作用域不是它所在的整个函数;
3.如果能不在函数中声明函数,就别这样做,这样实现起来逻辑复杂容易出错。

发布了17 篇原创文章 · 获赞 36 · 访问量 485

猜你喜欢

转载自blog.csdn.net/qq_44643644/article/details/105130564