【问题标题】:main() without return type on ClangClang 上没有返回类型的 main()
【发布时间】:2014-09-27 13:29:12
【问题描述】:

在使用 G++ 时,可以这样编写程序:

main() {
    // Something
}

而且它确实有效。当使用-Wall 选项时,它会产生一个警告:

$ g++ -Wall -o test test.cpp
test.cpp:1:6: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type]
 main() {
      ^

但是,基本上,它是有效的。但它不适用于 Clang:

$ clang++ -o test test.cpp
test.cpp:1:1: error: C++ requires a type specifier for all declarations
main() {
^~~~
1 error generated.

这是我的问题:有什么方法可以强制 Clang 表现得像 G++,即允许 main() 没有返回类型?

另外,这里解释一下原因:在一些算法竞赛中,做#define int long long 很方便——它只是将所有整数替换为长整数,所以整数溢出基本上没有问题(你不需要记住它 => 当你的时间有限时,你不会浪费时间来调试你的程序)。当然,你不能写long long main(),所以在使用GCC的时候你可以写main(),就可以了。我要问的是“如果你更喜欢 Clang 而不是 GCC”。 显然,将这​​些信息放在这里会提出一个问题“为什么 #defines 不好,为什么参赛者是白痴”而不是“有没有办法强制 Clang 接受 main() 没有返回类型的函数声明...

【问题讨论】:

  • #define int long long - 这太残忍了;请不要那样做!这就是typedefs 的用途。
  • @Oli 编程参赛者通常会做这样可怕的事情来节省打字时间。 #define vpll std::vector<std::pair<long, long>> 等等。
  • @Cicada:坦率地说,他们是白痴。 typedef 不会少打字,而且会更安全!
  • @m4tx:重新编辑。你有一个XY problem,因此是 cmets。您的实际问题是“我如何简洁地修改我的计算类型?”,而不是“我如何强制 Clang 忽略缺少的返回类型?”。
  • 本着您的实践精神,#define main int main 怎么样? :)

标签: c++ gcc clang


【解决方案1】:

如果您的问题是:

如何告诉 clang 默认声明为 int

那么答案是:在 C++ 模式下不可能。 clang仅在 C 模式下接受此类代码。这是符合标准的行为。

【讨论】:

    【解决方案2】:

    省略 int 在 C++ 中从来都不是合法的。如果你想把它留在clang中,那么你必须选择一种合法的语言。 clang 无法禁用或降级默认错误的诊断,也不支持任何可以省略 int 的 C++ 扩展或模式。

    C89 允许省略类型,假设 int

    ⑆ clang -std=c89 -Weverything -x c - <<< 'main() {puts("hello, world"); }'
    <stdin>:1:9: warning: implicit declaration of function 'puts' [-Wimplicit-function-declaration]
    main() {puts("hello, world"); }
            ^
    1 warning generated.
    ⑆ ./a.out
    hello, world
    

    如果您想快速修改您的程序以将 int 的用法替换为另一种类型,那么您可能希望首先使用类型别名(或 typedef)来编写您的程序:

    using my_int = int;
    

    既然你提前清楚地知道你想做这种事情,那么这应该不是问题。如果由于某种原因您在编写程序之前永远无法记住这一点,那么您可以使用“搜索和替换”之类的工具。

    例如,在 vim 中,您可以对多个文件执行此操作,方法是创建要修改的文件的 arglist,然后在该列表上运行替换命令

    :args *.cpp *.hpp
    :argdo v/\<main\>/s/\<int\>/my_int/g
    :wall
    

    【讨论】:

      【解决方案3】:

      使用int32_t怎么样?在大多数平台上,它应该等同于int

      $ echo '#include <stdint.h>\n#define int long long\nint32_t main() { }' | clang -xc -
      $ ./a.out
      

      好像还可以……

      更新

      也就是说,对于足够长的整数,我宁愿建议您使用 int 以外的其他值。

      typedef long long v; // 'v' for variable
      
      v arr[10];
      

      缩短两个字符!

      抛开玩笑不谈,我的许多热衷于编程竞赛的朋友并没有真正尝试通过使用这些技巧来节省时间。您应该提高 DP、Kruskal、Prim 和 Dijkstra 的技能。

      【讨论】:

      • @OliverCharlesworth 我从 OP 那里得到的印象是,可移植性或安全/健全的代码不是他的优先事项。
      猜你喜欢
      • 1970-01-01
      • 2021-03-24
      • 2013-07-16
      • 2011-04-08
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      相关资源
      最近更新 更多