【问题标题】:what is the meaning of main(i) in C, and how does it work? and what is the value and type of i?C 中 main(i) 的含义是什么,它是如何工作的? i 的值和类型是什么?
【发布时间】:2015-09-23 06:07:34
【问题描述】:
void main(i)
{
    printf("%d",i);
}

这里的main(i) 是什么意思以及它是如何工作的? i 的值和类型是什么?

【问题讨论】:

  • 使用签名int main...
  • 当我用 gcc 编译器尝试它时,它给出 1 作为输出

标签: c main


【解决方案1】:
void main(i)

声明一个没有类型的函数参数仅在旧的、过时的 C90 标准中有效。在 C90 中,i 将默认输入 int

如果此代码用于独立实现(嵌入式系统或操作系统),则它在 C90 中是有效的。它相当于void main (int i)。您的编译器需要记录这种形式的 main() 应该做什么。

如果此代码用于托管实现(在操作系统上运行的编程),则它无效并且不会编译。 C90 2.1.2.2 托管环境只允许两种形式的 main():

int main(void) 
int main(int argc, char *argv[])

在较新的 C 标准中,无论是独立的还是托管的,代码都将无效,因为“默认为 int”规则已从语言中删除。

【讨论】:

    【解决方案2】:

    可能类型为int,表示命令行传递的参数个数;包括程序的名称。

    但您不应该像这样编写 main 原型,因为正式的程序行为是实现定义的,因此可能因平台而异。

    请改用int main(void)int main(int argc, char **argv)

    【讨论】:

    • 不使用这两种主要形式(对于托管系统)不是未定义的,它是实现定义的行为。
    • 盲目更改:现在无法验证 - 在我应该注意的会议中。
    【解决方案3】:

    首先,

    void main(i)
    {
        printf("%d",i);
    }
    

    C 中的无效 语法,你不应该使用它,因为C 标准说

    1. 案例 1:[C11, §5.1.2.2.1 ],在托管环境中,

      • main() 应该返回 int
      • 它应采用 0 (void) 或 2 (int argc, char*argv[] 或等效) 参数。
    2. 案例 2:在独立的环境中,

      • 无效(根据最新标准),因为C 标准不再支持“变量类型默认为int”的概念。

    [这只是为了理解,标准中不再支持,因此不能保证行为。]

    现在,来到上述代码的含义部分,在main()中提供i的定义是一种hacky and obsolete方式,主要是code golfing 中使用以缩短代码大小。 i 的类型在此处默认为 int,并保存提供给程序的扩充数量(包括程序名称)。

    因此,例如,如果程序像这样运行

     ./test
    

    在程序中,i 的值最有可能1

    【讨论】:

    • 无效,因为隐式 int 已从语言中删除。由于此处所述的原因,它并非无效。此外,您引用了 hosted 实施章节,问题中没有任何内容表明这是一个托管系统。
    • @Lundin 感谢您的更正。会相应更新。另外先生,在独立的main() 本身不需要命名为main(),不是吗?
    • 不,它可以命名任何东西。
    • 问题是,C99 和 C11 有“或以某种其他实现定义的方式”的子句,可以用两种方式解释:要么 main() 的参数允许不同(我做了here) 的解释或 main 的整个形式可能不同(例如 Windows 的 WinMain 函数)。
    • @Lundin 绝对正确,先生。只是我个人的意见,到目前为止,我一直把它读成 "....并且没有参数....或有两个参数...或以其他一些实现定义的方式",所以我相信它只是在谈论参数,但现在我明白你的意思了。看起来模棱两可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    相关资源
    最近更新 更多