【问题标题】:Returing string from main function in c++从 C++ 中的主函数返回字符串
【发布时间】:2013-10-13 16:52:39
【问题描述】:

有没有办法从 C++ 中的主函数返回字符串?我在下面提到示例程序

string main(int argv, char* argc[])
{
  .
  .
  return "sucess";
}

【问题讨论】:

标签: c++


【解决方案1】:

不,它不符合标准。您必须返回一个 int 以便向调用者显示程序是如何退出的(很好,有错误?)。

你为什么要返回一个字符串?

【讨论】:

  • 我正在从 shell 脚本运行 c++ 二进制文件。我需要将字符串返回给 shell 脚本以供进一步决策。
  • 为此,您可能希望使用程序的输出,但如果您确实需要,也可以将返回值转换为脚本中的某个字符串。
  • @kayle 如果你想在 shell 中使用程序的输出作为文本,你必须在 shell 中捕获它。例如,在 bash 中,在 $(...) 中调用您的程序。\
【解决方案2】:

不,你不能在 c++ 中从 main 返回字符串,因为 main 函数的返回值是进程返回码(如果成功则为 0,如果进程失败则不是 0)。因此,操作系统正在等待您的应用发出适当的结束信号。

【讨论】:

    【解决方案3】:

    标准说:

    3.6.1 主函数[basic.start.main]

    2/ 实现不应预定义主要功能。该功能不得重载。 它的返回类型应该是 int 类型,否则它的类型是实现定义的。所有实现都应允许两者

    • () 返回int
    • 的函数
    • (int,指向char指针的指针)的函数返回int

    作为 main 的类型。 [...]

    所以不,你必须返回一个 int。

    从您帖子中的 cmets 来看,您似乎只想在标准输出上输出一个字符串,那么您可以这样做:

    #include <iostream>
    int main()
    {
        std::cout << "Success" << std::endl;
        // No need for return 0; it is implicit in C++
    }
    

    正如 Kerrek SB 在 cmets 中所说,return 0; 隐含在 C++ 中(标准 § 3.6.1 /5):

    [...] 如果控制到达main 的末尾而没有遇到return 语句,则效果是执行

    return 0;
    

    【讨论】:

    • 如果您进一步阅读该部分,您会发现return 0 是多余的:-)
    • @KerrekSB 你是对的。我编辑了我的帖子。感谢您指出这一点;)
    【解决方案4】:

    不,您不能,您必须始终返回int。更深入地思考,字符串对于shell程序来说是很难处理的:什么时候释放内存,返回什么样的字符串等等。)

    但是,您可以使用std::coutstd::cerr 写入标准输出标准错误。当您希望控制台应用程序输出类似字符串的数据时,这是正常的做法。

    通常情况下,您会依赖操作系统 shell 将程序的标准输出定向到另一个程序的输入(为此,unix 使用管道 |)。

    【讨论】:

      【解决方案5】:

      您可能的意思是写入标准输出

      #include <cstdio>
      
      int main()
      {
          // ...
      
          std::puts("success");
      
      }   // no "return", success is implicit in C++
      

      这是进程通信数据的标准方式之一,许多工具都适合以这种方式使用。

      【讨论】:

      • 为什么在 c++ 程序中使用 puts?使用标准 cout 流!
      • @KerrekSB:为什么不呢?请注意,我不是强加什么,只是想知道原因。
      • @legends2k:在这种情况下,std::puts 正是我想要的,不多也不少;易于阅读,没有隐藏成本或默认构建的语言环境——有时拥有一些简单的东西感觉很好。我会在合适的时候使用 iostream,但我喜欢经常混合使用。
      • @KerrekSB:有道理;在不了解它真正是什么/做什么的情况下,对某事抱有坚定的狂热是没有意义的。
      • @legends2k:我真希望我能更喜欢 iostreams。我当然将它们用于getline 等,但是它们有很多丑陋和令人讨厌的部分(例如,如果您尝试编写十六进制转储程序,那么冗长的冗长,或者格式化数字时的性能不佳),即我还没有设法在脑海中完全接受它们......
      猜你喜欢
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-11-06
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多