【问题标题】:How do I call main() in my main cpp file from a seperate cpp file?如何从单独的 cpp 文件中调用我的主 cpp 文件中的 main()?
【发布时间】:2015-01-30 17:47:00
【问题描述】:

我正在创建一个向用户显示消息并询问他们是否要返回程序开头的类,但消息函数与我的 main() 所在的位置不同。如何从不同的类访问 main() 函数?

这是我想做的事情的一个例子:
main.cpp 文件:

int main()
{
    Message DisplayMessage;
    DisplayMessage.dispMessage();
    return 0;
} 

Message.cpp 文件:

void dispMessage(void)
{
    cout << "This is my message" << endl;
    //now how do I call main again in the main.cpp file?
}

谢谢!

【问题讨论】:

  • 我不确定这是否或如何工作,但无论如何我认为你不应该这样做,因为肯定有更优雅的解决方案。
  • 你不会调用 main,永远
  • 您可以使用您的dispMessage 返回的布尔值。也许:bool dispMessage(void){..//if you want to show this again return true; if not return false.} 和你的主:while(dispMessage(){}) 或类似的东西应该给出与再次调用 int main() 相同的行为
  • main 作为应用程序的entry point 不应直接调用。
  • 你真正想做什么?

标签: c++ console-application


【解决方案1】:

你不这样做,将dispMessage 的返回值更改为 int 或类似值,从检查返回码的主要部分并根据它执行不同的操作。

【讨论】:

  • 但是我如何再次执行所有的 main ?假设我的 main 中有 cout 语句,我该怎么做才能在用户决定从单独的类再次运行程序后打印出来?
【解决方案2】:

也许是这样的:

bool dispMessage(void)
{
  cout << "This is my message" << endl;
  // call me again
  return true;

  // do not call me again
  return false;
}

int main():

int main()
{
  Message DisplayMessage;
  while(DisplayMessage.dispMessage())
  {

  }
  return 0;
} 

【讨论】:

    【解决方案3】:

    假设您可以将 dispMessage(void) 更改为类似 bool askForReturnToStart() 的内容,那么您可以使用它在 main 中构建一个循环,例如:

    int main() {
      Message dm;
      do {
        // whatever
      } while (dm.askForReturnToStart());
    }
    

    【讨论】:

      【解决方案4】:

      在 C++ 中,程序调用 main 本身是非法的,所以简单的答案是你不要。您需要重构您的代码,最简单的转换是在main 中编写一个循环,但其他替代方法可能包括将main 中的逻辑分解为一个在标头中声明并且您可以调用的不同函数。

      【讨论】:

      • 为什么调用main是非法的?
      • @davidpox:我不确定,但我认为的动机是释放实现以在 main 函数中设置和删除 C++ 运行时,同时保留 main 作为操作系统调用以启动程序的外部入口点。可能实现可以做到这一点,并仍然确保main 也可以从程序内部调用,而无需第二次做额外的事情,但标准通常会降低实现便利性。简短的回答是,“因为标准是这样说的”。
      【解决方案5】:

      main 是特殊的,你不能在 C++ 中调用它。

      因此,“显而易见”的做法是将所有内容移至另一个函数:

      int my_main()
      {
          Message DisplayMessage;
          DisplayMessage.dispMessage();
          return 0;
      } 
      
      int main() 
      {
          return my_main();
      }
      

      现在你可以从任何你喜欢的地方调用my_main(当然,只要你首先在你想要调用它的翻译单元中声明它)。

      我不确定这是否真的能解决你的问题,但它尽可能接近再次调用main

      如果您从程序中的其他地方调用my_main,那么您将不会完全“回到起点”,您将在未完成旧代码的情况下开始新的代码运行。通常是为了“回到开始”你想要一个循环的东西。但这取决于你。如果您递归的次数太多以至于堆栈空间不足,请不要来找我们哭泣;-)

      【讨论】:

      • 到目前为止这很好,谢谢!但是如何从单独的 cpp 文件中调用这个 my_main() 呢?
      • @davidpox:请参阅您的 C++ 教科书或教程,了解如何在文件中组织函数并调用它们。评论可能不足以解释您需要了解的所有内容。您需要的声明是int my_main();
      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多