在C++中从主函数返回字符串

5
有没有办法在C++的主函数中返回字符串?下面是一个示例程序。
string main(int argv, char* argc[])
{
  .
  .
  return "sucess";
}

3
为什么你想要做那个?谁会收到这个字符串? - Asaf
2
你打算如何使用那个字符串? - zakinster
返回“成功”(逐字)的讽刺意味不知怎么说... - WhozCraig
1
@kayle 然后在 cout 上打印...那就是它的作用。 - erlc
1
@kayle shell 正在获取已执行进程的 退出状态,该状态只能是整数。为此,请使用标准输出 - zakinster
显示剩余5条评论
5个回答

9
标准规定如下:
3.6.1 主函数 [basic.start.main]
2/ 实现不得预定义主函数。此函数不应重载。它应返回类型为int,但除此之外,其类型是实现定义的。所有实现都应允许以下两种形式作为main的类型:
- 一个()返回int类型的函数 - 一个(int,指向指针的char)返回int类型的函数
所以,不,你必须返回一个int。
从您在帖子上的评论中可以看出,您似乎只想在标准输出上输出一个字符串,那么您可以这样做:
#include <iostream>
int main()
{
    std::cout << "Success" << std::endl;
    // No need for return 0; it is implicit in C++
}

正如Kerrek SB在评论中提到的那样,在C++中return 0;是隐含的(标准§ 3.6.1 /5):

[...] If control reaches the end of main without encountering a return statement, the effect is that of executing

return 0;

如果您继续阅读该部分,您会发现return 0是多余的 :-) - Kerrek SB
@KerrekSB 你是对的。我编辑了我的帖子。谢谢你指出这一点 ;) - Pierre Fourgeaud

4

不,它不符合标准。你必须返回一个整数,以向调用者显示程序是如何退出的(良好、出错)。

而且为什么要返回一个字符串呢?


我正在从shell脚本中运行c++二进制文件。我需要将字符串返回给shell脚本以供进一步决策。 - kayle
为此,您可能想使用程序的输出,但如果您真的想要,也可以在脚本中将返回值转换为某个字符串。 - Hulk
如果你想要在 shell 中将程序的输出作为文本使用,你需要在 shell 中捕获它。例如,在 bash 中,可以在 $(...) 中调用你的程序。 - James Kanze

4
不可以,必须始终返回一个 int。深入思考一下,一个字符串对于 shell 程序来说会很困难:何时释放内存,返回什么类型的字符串等等问题。
但是你可以使用 std::cout 或 std::cerr 向标准输出或标准错误写入数据。当你想让控制台应用程序输出类似字符串的数据时,这是正常的做法。
通常情况下,你需要依靠操作系统 shell 将程序的标准输出重定向到另一个程序的输入上(unix 中使用管道 | 实现)。

2
您可能是想要将内容输出到标准输出
#include <cstdio>

int main()
{
    // ...

    std::puts("success");

}   // no "return", success is implicit in C++

这是进程之间通信数据的标准方式之一,许多工具都是为以这种方式使用而设计的。


为什么在C++程序中使用puts? 使用标准的cout流! - erlc
1
@KerrekSB:为什么不呢?请注意,我并没有强加或者什么的,只是好奇想知道原因。 - legends2k
1
@legends2k:在这种情况下,std::puts恰好做我想要的事情,没有多余的东西;易于阅读,没有隐藏的成本或默认构造的区域设置--有时拥有简单的东西感觉很好。当适合使用iostreams时,我会使用它,但我喜欢不时地混合使用。 - Kerrek SB
@legends2k:我真的希望我能更喜欢 iostreams。当然,我会使用它们进行“getline”等操作,但是它们确实有许多难看和不舒服的地方(例如,如果您正在编写十六进制转储程序,则代码冗长丑陋,或者在格式化数字时性能差),因此我还没有完全接受它们... - Kerrek SB
@legends2k: (更不用说iostreams库中那个完全神秘的“facets”部分了,我从来没有看到过它被很好地利用。我很想尝试,也很想相信它设计得很好,但这个启示还没有降临到我身上...) - Kerrek SB
显示剩余3条评论

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接