这个问题只是半开玩笑的。我有时做梦都想过没有裸数组或C字符串的世界。
如果你在使用C++,那么main函数的首选定义应该是什么样的呢:
int main(std::vector<std::string> args)
为什么没有一个符合C++精神的main
版本,已经有多个定义可以选择了呢?
这个问题只是半开玩笑的。我有时做梦都想过没有裸数组或C字符串的世界。
如果你在使用C++,那么main函数的首选定义应该是什么样的呢:
int main(std::vector<std::string> args)
为什么没有一个符合C++精神的main
版本,已经有多个定义可以选择了呢?
main
函数的定义可以选择了,为什么不添加一个类似于C++的版本呢? - Inversestd::vector<std::string> args(argv, argv+argc)
。标准委员会更喜欢只在新功能相比库方法有显著优势时才将其添加到语言中。 - jalfmain
函数。 - GManNickGmain
的多个版本都使用 C 调用约定彼此兼容。如果 RTL 调用 main(argc, argv, envp)
,而你提供的函数只是 main(int, char*[])
,那么额外的第三个参数会被安全地忽略。可以编写一个 RTL,始终调用一个单一版本的 main
,而不考虑你提供的哪个版本。但是 main(vector<string>)
与其他版本不兼容,因此 RTL(已经编译在单独的 .o 文件中)需要知道你在源代码中提供了什么。 - Rob Kennedystd::string
和std::vector
,这是完全按设计来的。事实上,按设计来说,您应该能够使用标准库的某些部分而无需使用其他部分(尽管这导致了一些一般令人讨厌的事情,如std::ifstream
和std::ofstream
操作const char*
C风格字符串,而不是std::string
对象)。main
以接受标准库中定义的类型的参数,就会破坏这个设计目标。main()
。如果可能的话,您仍然可以拥有 C 风格的 main()
,而没有标准库。 - einpoklum<vector>
和 <string>
。<vector>
和 <string>
实现。 - Mike Seymourmain
。如果编译器生成了一个秘密函数,由运行时库找到并将C参数转换为您选择的C ++类型,然后调用实际的 main
,就不应该有冲突。除非我漏掉了什么,否则这将是一个完全透明的更改。 - Dennis Zickefoosemain()
变体。添加一个特定于C ++的变体并不一定意味着您必须使用它(现有选项仍然可以作为选项)。这可能会使编译器/链接器需要支持正确调用main()
所需的机制变得更加复杂,但这并非不可能。我不是说它一定值得代价和复杂性 - 只是说它不是不可能的。 - Michael Burrint main(T args); int _Main(argc, argv) { return main(T(argv, argv + argc)); }
- Dennis Zickefoose像 @jalf 一样,我有时也会写下
int main(int argc, char** argv) {
std::vector<std::string> args(argv, argv+argc);
但是,像其他人所说的那样,main
函数必须兼容C语言。我认为它是操作系统运行时的接口,而这些操作系统(至少在我使用的系统中)都是用C编写的。
尽管有些开发环境鼓励使用替代函数,如wmain
或_tmain
。您可以编写自己的编译器/IDE,以鼓励使用 int vmain(const std::vector<std::string>& args)
。
main
不会是一个巨大的飞跃;唯一真正的反对意见是你必须标准化vector
和string
的实现。 - Mike Seymourint main(std::initializer_list<std::initializer_list<CharT>>)
! - Cubbimain()
片段,它什么也不做,只返回cppMain(vector<string>(argv, argv+argc));
,并将cppMain()
用作程序的“可定制”起点。我可能会开始使用这个... - Michael Burrstd::vector<std::string>>
”要麻烦得多。基本上,为了保持与C的兼容性。如果我们放弃这一点,main()函数将被移入一个类中。
int main(void)
(C99)int main(int argc, char *argv[])
(C99)int main(int argc, char *argv[], char *envp[])
(POSIX,我想)extern "C" int main(std::vector<std::string> argv)
。运行时将使用错误的参数调用main()并失败。这没有简单的解决方法。extern "C"
,运行时可以尝试按顺序使用各种支持的符号,直到找到一个为止。我想main()默认是extern "C"
,而且你不能重载extern "C"
函数。我会尽可能用最好的句子来解释。
C++ 的设计是向后兼容 C,std::vector
是包含在一个只有在 C++ 中才被包含的库中的。
此外,C++ 和 C 程序都是设计为在 shell 或命令行(Windows、Linux、Mac)中运行的,操作系统将参数作为字符串数组传递给程序。那么操作系统如何真正地翻译向量呢?
这是我能想到的最主要的原因,欢迎批评。