C 是否有相当于 Python 的: if __name__ == '__main__': 在文件顶部写入 main() ?

Hen*_*son 6 c python function cs50

在 C 语言中,之前编写函数声明main似乎是多余的。

我不想使用这些方法:

  1. 将函数写入不同的文件中,然后在顶部导入。
  2. 将整个函数写在main之前。
if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

C 的方式是什么?

#include <stdio.h>

void printHello(void);

int main(void)
{
    printHello();
}

void printHello(void)
{
    printf("Hello World\n");
}
Run Code Online (Sandbox Code Playgroud)

环境:我正在使用一个 make 脚本,该脚本使用 clang 并在哈佛的 cs50 云 IDE 中进行附加检查。IDE 使用 c99 版本的语言设置,如果没有函数声明则无法编译。

我的测试:仅使用 clang 仍然错误相同;使用GCC实际上编译时只带有警告。

为什么海湾合作委员会有效? GCC 看到一个没有前面声明的函数调用,它假设该函数返回 int 并编译。(c99 之前的行为)

已解决:c99 定义消除了隐式类型,因此所有函数都必须在使用前声明。在 C 语言中,没有等效的 for:if __name__ == '__main__':在文件顶部写入 main() 的用途。

感谢约翰·博德的帮助;现在有意义了。

Ang*_*vil 0

您确实需要进行前向声明(如果您想将 main 保留在文件开头),因为该代码将被编译而不是执行。当编译器逐行编译时,它在到达函数之前不会知道函数的签名。

人们习惯于在文件底层开发更重要的功能。

但是编译是如何工作的呢?

编译实际上分两步完成。

1)Gcc(或您使用的任何东西)将为您拥有的每个文件制作预编译版本。

2)它将所有这些预编译文件链接到可执行文件或库文件等...

现在您知道了这一点,您就可以理解它是如何工作的:

  • 第一步,编译器只能知道单个文件中存在的函数/变量,但不知道其他文件,所以如果你调用一个不在文件中的函数==>他会不高兴并生成一个“未声明”函数”错误。但是,如果您向他提供头文件,您基本上会告诉编译器“不要介意缺少此函数,我稍后会在链接时在另一个文件中添加它”。因此编译器会忽略该错误。
  • 在第二步中,当将所有文件链接在一起时,它将再次检查您是否遵守了诺言,为他提供了头文件中定义的函数的实现。否则,你会得到另一种错误,比如“无法找到函数XXX”(我的错误名称不准确,我已经一年没有做过C了)。