【问题标题】:Non-portable const in mainmain 中的非可移植 const
【发布时间】:2020-12-26 15:22:32
【问题描述】:

在表单中使用main函数:

int main(int argc, const char* argv[])

非便携和非标准? C++ 标准说argv 是“指向字符指针的指针”。我更喜欢使用 const 这个词来防止在(对我而言)未知的内存区域进行修改和越界。

这样的形式是错误的,不可移植的吗?

【问题讨论】:

  • main() 的正确签名是ìnt main(int argc, char **argv)。 (这是出于历史原因。)
  • 仅供参考:SO: Are the strings in argv modifiable?(嗯 - 它是为 C 编写的。我试图为 C++ 找到一些东西 - 最近读过一些东西......)
  • @Scheff 好的,它是正确的,但是签名 ìnt main(int argc, const char **argv) 不正确吗?
  • 是的。 main() 的可能签名由标准定义:Main function(可能有扩展,但这取决于编译器。显然,您的编译器不喜欢const char *argv[]。);-)
  • 我更喜欢使用 const 这个词来防止在我不知道的内存区域进行修改和越界。 有一个非常简单的解决方案:namespace My { int main(int argc, const char *argv[]) { /* your code */ return 0; } } /* namespace My */ int main(int argc, char **argv) { return My::main(argc, argv); }

标签: c++ standards main


【解决方案1】:

您的版本确实不可移植。

标准允许的变体是

int main() 
int main(int argc, char* argv[])
int main(int argc, char** argv)

该标准允许实现定义的可能性,因此在某些平台上可能允许const。但是,如果实现没有定义这样的替代方案,那么您的程序的行为是未定义的。

【讨论】:

  • 我很惊讶。我早就料到如果不实现的话编译器会拒绝它,这比UB好。
  • @Damien:我想这就是为什么 C++ 不适合吃乳蛋饼的人。我最喜欢的未定义语句之一是unsigned n = -1e0;
  • @Damien 在这种情况下,没有什么能阻止编译器发出诊断。我猜这只是不值得去做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 2012-05-06
  • 2013-07-05
  • 2010-10-02
  • 2022-08-19
相关资源
最近更新 更多