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

main() without return type on Clang

本文关键字:main 返回类型 Clang      更新时间:2023-10-16

使用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()函数声明而不返回类型…

如果您的问题是:

如何将clang-to-default声明告知int

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

在C++中,省略int从来都不是合法的。如果你想在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中,您可以对多个文件执行此操作,方法是创建要修改的文件的参数列表,然后在该列表上运行替换命令

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

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

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

看起来还可以…

更新

也就是说,我宁愿建议您使用int以外的东西来计算足够长的整数。

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

短两个字符!

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