这个问题昨晚出现在我的脑海中,我在谷歌上短暂浏览并没有找到明确的答案。我应该(或可以)在程序的
int32_t
函数的声明中使用可移植类型(即main
)吗?示例:
// Normal main function, works perfectly fine.
int main(int argc, char* argv[]) {
return 0;
}
// Portable(?) main function.
#include <stdint.h>
int32_t main(int32_t argc, char* argv[]) {
return 0;
}
可移植的
main
功能编译(GCC 14.1.1
),但这是好的做法吗?
您提供的定义是非标准的。或者更好的是,它被标准定义为“实现定义”,因此只有当您的编译器(实现标准)允许这样的定义时才允许。
我不知道主要编译器允许
int32_t
返回 main()
值。但必须注意的是,在各个平台上int32_t
只是typedef
的int
。该标准确实允许“等效” main()
声明,其中 int
被从 typedef
间接 int
的类型替换,但这肯定会因平台而异。
总的来说,这不是一个可移植的定义。标准可能允许这样做,但几乎可以肯定在某些平台上这是不符合标准的。我会避免它。
参考C99标准N1256:
5.1.2.2.1 程序启动
程序启动时调用的函数名为
。该实现没有声明该函数的原型。它应定义为返回类型main
并且不带参数:int
int main(void) { /* ... */ }
或带有两个参数(此处称为
和argc
,尽管可以使用任何名称,因为它们对于声明它们的函数来说是本地的):argv
int main(int argc, char *argv[]) { /* ... */ }
或等效的;9) 或以其他某种实现定义的方式。
[...]
9) 因此,int 可以替换为定义为
的typedef
名称,或者int
的类型可以写为argv
,依此类推。char ** argv