在Clang上没有返回类型的main()

时间:2014-09-27 13:29:13

标签: c++ gcc clang

使用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替换所有的int,所以整数溢出基本上没有问题(你没有需要记住它=>当你的时间有限时,你不会浪费时间调试你的程序)。当然,你不能写long long main(),所以在使用GCC时你可以写main(),它就可以了。我要求的是“如果你喜欢Clang而不是GCC会怎么样”。很明显,把这些信息放在这里会产生一个问题“为什么#define是坏的,为什么参赛者是白痴”而不是“有没有”强制Clang接受main()函数声明而不返回类型的方法......

3 个答案:

答案 0 :(得分:1)

如果你的问题是:

  

如何告诉clang默认声明为int

然后答案是:在C ++模式下它可能。 clang只接受C模式 中的代码。这是符合标准的符合行为。

答案 1 :(得分:1)

离开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

答案 2 :(得分:0)

如何使用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的技能。