在主函数的声明中应该使用可移植类型吗? (C11)

问题描述 投票:0回答:1

这个问题昨晚出现在我的脑海中,我在谷歌上短暂浏览并没有找到明确的答案。我应该(或可以)在程序的

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
),但这是好的做法吗?

c program-entry-point portability
1个回答
0
投票

您提供的定义是非标准的。或者更好的是,它被标准定义为“实现定义”,因此只有当您的编译器(实现标准)允许这样的定义时才允许。

我不知道主要编译器允许

int32_t
返回
main()
值。但必须注意的是,在各个平台上
int32_t
只是
typedef
int
。该标准确实允许“等效”
main()
声明,其中
int
被从
typedef
间接
int
的类型替换,但这肯定会因平台而异。

总的来说,这不是一个可移植的定义。标准可能允许这样做,但几乎可以肯定在某些平台上这是不符合标准的。我会避免它。


参考C99标准N1256

5.1.2.2.1 程序启动

  1. 程序启动时调用的函数名为

    main
    。该实现没有声明该函数的原型。它应定义为返回类型
    int
    并且不带参数:

    int main(void) { /* ... */ }
    

    或带有两个参数(此处称为

    argc
    argv
    ,尽管可以使用任何名称,因为它们对于声明它们的函数来说是本地的):

    int main(int argc, char *argv[]) { /* ... */ }
    

    或等效的;9) 或以其他某种实现定义的方式。

[...]

9) 因此,int 可以替换为定义为

typedef
int
名称,或者
argv
的类型可以写为
char ** argv
,依此类推。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.