为什么在程序中主要是必要的

时间:2010-11-24 07:26:49

标签: c

我制作了一个仍在开发中的程序。我没有故意在我的程序中声明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?

7 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:5)

如果要将代码构建到应用程序中,则必须存在

main,因为主要功能用作应用程序的入口点。

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

编辑:检查this以获取有关静态和共享库的信息。

答案 2 :(得分:4)

为什么呢?因为标准这样说(大多数)。

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

如果您正在开发一个库,那么库本身不需要main,但如果没有库,您将无法将其转换为可执行文件(除非使用非便携式技巧) )。而且,至少,你应该有一个测试套件。

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

答案 3 :(得分:1)

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

可以指定另一个函数作为入口点,但是使用main,读取代码的每个人都知道程序的起始位置。

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

主要是执行程序的必要条件。当您尝试执行用C编写的程序时,它将转到main函数并从此处执行。 如果你正在编写一个库,你最好编写一个简单的测试代码来调用你的库函数,编译并运行该测试程序来测试你的库

答案 6 :(得分:0)

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