【问题标题】:Why is this code running without int main()为什么这段代码在没有 int main() 的情况下运行
【发布时间】:2021-10-09 09:22:51
【问题描述】:
#include <stdio.h>
int main()
struct books
{
char title[50];
char author[50];
char sub[100];
int b_id;
};

//here int main should be used but not still the code runs fine why??

{
struct books b1={"48lop","rg","sh",288017};
printf("%s\n",b1.title);
printf("%s\n",b1.author);
printf("%s\n",b1.sub);
printf("%d",b1.b_id);
return 0;
}

【问题讨论】:

  • 函数签名 和函数体之间的旧式(如 1989 年之前)参数(有点,你的 main 没有参数)。
  • 你是如何运行它的? gcc 和 clang 都不会编译这段代码,你应该得到一个编译错误。
  • @ifalkau 编译:ideone.com/G9gssk OT:旧式参数(AKA K&R 风格)将在下一个标准中删除。
  • 明明有int main(),你为什么说它没有?

标签: c structure


【解决方案1】:

这是因为您使用的是 k&r 语法。

您不使用 ANSI C 语法。

【讨论】:

    【解决方案2】:

    最初在 C 中,函数的定义方式是:

    int MyFunction(a, b, c)    // List of parameter names here. No declarations, just names.
    
    int   a;                   // Declarations of parameter types here.
    float b;
    char  c;
    
    {
        …                      // Body of function here.
    }
    

    一个问题是函数声明,如int MyFunction(a, b, c);,没有指定参数的类型。这会阻碍编译器检查调用是否传递了正确类型的参数。为了改善这种情况,引入了现代风格,在函数声明符 (int MyFunction(int a, float b, char c)) 的括号内声明参数类型。

    您编写代码的方式符合旧风格。 int main() 没有参数声明。它确实有一个参数名称列表,但该列表是空的。然后,在int main() 之后,它有一个声明。这是一个结构类型的声明——它只声明类型,如struct foo {int x;};。它没有声明该类型的实际结构,如struct foo {int x;} MyFoo;。函数声明符和函数体之间的声明应该声明函数的参数。有一个只声明一个类型而不是参数的声明违反了 C 标准中的约束,但是您的编译器似乎是宽容的并允许此声明(可能带有警告消息),因为尽管它没有声明函数的参数,它也没有声明任何其他对象(只是一个类型)。

    没有理由在新代码中使用这种旧形式的函数声明。编译器仍然只接受它,以便仍然可以编译旧代码(非常旧的代码)。

    【讨论】:

      【解决方案3】:

      这是因为您的编译器重新排列了您的代码。如果你检查从你的 c 代码生成的汇编代码,你会看到你的编译器做了什么。

      【讨论】:

        猜你喜欢
        • 2015-09-06
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 2016-07-26
        • 1970-01-01
        • 2022-07-08
        • 2013-08-08
        • 2022-01-10
        相关资源
        最近更新 更多