在Clang上没有返回类型的main()
main() without return type on 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()
函数声明而不返回类型…
如果您的问题是:
如何将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的技能。
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 为什么返回类型中需要typename?C++
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 推导 std::vector::back() 的返回类型
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- c/c++中main()的默认返回类型
- 在Clang上没有返回类型的main()
- 你能在main函数中省略返回类型吗?