【问题标题】:Why is main necessary in a program为什么 main 在程序中是必需的
【发布时间】:2010-11-24 07:26:48
【问题描述】:

我制作了一个仍在开发中的程序。我没有故意在我的程序中声明 main。因为我正在开发一个库来制作我将在我的程序中使用的图形和其他算法。在 C 中开发这样一个库的目的是解决本书介绍中给出的问题算法 Thomas H Coreman 如果有人想看,这是代码。

#include<stdio.h>
#include<stdlib.h>
#define GREY 1
#define BLACK 0
#define WHITE 2
typedef struct node *graph;

graph cnode(int data);      //cnode is to create a node for graph
void cgraph(void);
struct node {
    int data, color;
    struct node *LEFT, *RIGHT, *TOP, *DOWN;
};

graph root = NULL;

void cgraph(void)
{
    int n, choice, dir, count;

    choice = 1;
    count = 1;
    graph priv, temp;

    printf("Printf we are making a graph the first is root node\n");
    while (choice == 1) {
        count++;
        if (count == 1) {
            printf("This is going to be root node \n");
            scanf("%d", &n);
            root = cnode(n);
            count--;
            priv = root;
        }       //ending if
        else {
            printf
                ("Enter direction you want to go LEFT 1 RIGHT 2 TOP 3 DOWN 4\n");
            scanf("%d", &dir);
            printf("Enter the data  for graph node\n");
            scanf("%d", &n);
            temp = cnode(n);
            if (dir == 1) {
                priv->LEFT = temp;
            }
            if (dir == 2) {
                priv->RIGHT = temp;
            }
            if (dir == 3) {
                priv->TOP = temp;
            }
            if (dir == 4) {
                priv->DOWN = temp;
            }
            priv = temp;
        }       //ending else
        printf
            ("Enter 1 to continue adding nodes to graph any thing else would take you out\n");
        scanf("%d", &choice);
    }           //ending while
}               //ending main

graph cnode(int data)
{
    graph temp = (graph) malloc(sizeof(graph));

    temp->data = data;
    temp->LEFT = NULL;
    temp->RIGHT = NULL;
    temp->TOP = NULL;
    temp->DOWN = NULL;
    temp->color = -1;
    return temp;
}

当我编译上述程序时,出现以下错误。

cc graph.c
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

这个错误意味着什么?为什么要在我的程序中声明 main?

【问题讨论】:

标签: c


【解决方案1】:

默认情况下,gcc(和大多数 C 编译器)编译并链接到独立的可执行文件。 main() 函数是必需的,以便启动代码知道应该从哪里开始执行代码。

要在不链接的情况下编译您的库代码,请使用gcc -c graph.c。在这种情况下,graph.c 不需要 main() 函数。

【讨论】:

    【解决方案2】:

    如果您将代码构建到应用程序中,则必须存在main,因为主函数用作应用程序的入口点。

    但是,如果您的代码是作为 lib 构建的,则不需要 main。

    编辑:查看this 了解有关静态库和共享库的信息。

    【讨论】:

    • 是的,我正在尝试为我的程序创建一个库,所以我会继续编译以检查代码,那么我应该怎么做才能摆脱这些错误?
    • @Bond,我已经编辑了我的答案并提供了一个链接来解释如何构建静态和共享库。无论如何要检查代码,您只能编译它并避免链接它。按照 caf 的建议使用 gcc -c graph.c 仅用于编译。
    【解决方案3】:

    为什么?因为标准是这样说的(大部分)。

    托管 C 环境需要 main 函数(允许独立环境以任何他们喜欢的方式启动)。

    如果您正在开发一个库,则不需要为库本身提供main,但如果没有它,您将无法将其转换为可执行文件(除非使用不可移植的技巧)。而且,无论如何,您至少应该有一个用于测试套件。

    换句话说,您的库应该有一个大型测试套件,由main 函数控制(很可能在一个或多个单独的源文件中),以便您可以测试任何新工作和回归测试以确保它没有把旧的工作塞满。

    【讨论】:

      【解决方案4】:

      一个程序需要一个入口点来明确你的程序从哪里开始。没有它,您的工具就不可能知道应该首先调用哪个函数。

      可以指定另一个函数作为入口点,但是通过使用 main,每个阅读您的代码的人都会知道您的程序从哪里开始。

      通常,在开发库时,您会将 main 放在一个单独的程序中,并在测试您的库时将其作为起点。像这样的:

      gcc -o library.o -c library.c
      gcc -o main.o -c main.c
      gcc -o testprogram library.o main.o
      

      【讨论】:

        【解决方案5】:

        通常main() 会自行启动。如果你忽略main() 它需要任何启动器来执行程序。基本上 main 是编译器在执行程序时识别的标识符。

        【讨论】:

        • 欢迎来到 SO!在发布答案之前,也请查看其他答案。这个 Q 已经有一个可接受的答案,我相信你的答案具有相同的内容。如果您为旧问题提供新答案,它应该会增加价值。
        【解决方案6】:

        main 是执行程序所必需的。当您尝试执行用 C 编写的程序时,它会转到 main 函数并从此处执行。 如果你按照你说的写一个库,你最好写一个简单的测试代码来调用你的库函数并编译并运行那个测试程序来测试你的库

        【讨论】:

          【解决方案7】:

          正式地说,这是加载程序的要求,而不是编译器的要求。程序员会知道每个程序在执行之前都应该加载到上下文中。这是加载程序的责任,但如果没有定义“入口点”的标准,加载程序不知道哪一行代码是入口点。

          【讨论】:

          • 此外,如果您仅构建目标文件或库,则不会链接到可执行文件。这种情况下不需要“主要”入口点。
          猜你喜欢
          • 2010-10-30
          • 2011-07-10
          • 1970-01-01
          • 2011-09-24
          • 2012-03-27
          • 2017-02-02
          • 2019-10-27
          • 2010-10-14
          • 2020-01-10
          相关资源
          最近更新 更多