我做了一个仍在开发中的程序。我没有在我的程序中故意声明main。因为我正在开发一个库来制作图形和其他我将在我的程序中使用的算法。用C语言开发这样一个库的目的是解决《算法导论》一书中给出的问题。托马斯H科勒曼这里是代码,如果有人想看的话。
#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?
8条答案
按热度按时间mzaanser1#
默认情况下,
gcc
(和大多数C编译器)编译并链接到一个独立的可执行文件。main()
函数是必需的,这样启动代码就知道代码应该从哪里开始执行。若要在不进行链接的情况下编译库代码,请使用
gcc -c graph.c
。在这种情况下,graph.c
不需要main()
函数。fiei3ece2#
如果要将代码构建到应用程序中,则必须存在
main
,因为main函数用作应用程序的入口点。但是,如果您的代码是作为lib构建的,则不需要main。
编辑:有关静态库和共享库的信息,请查看this。
7fhtutme3#
为什么?因为标准是这么说的(大部分)。
main
函数对于托管的C环境是必需的(独立环境允许以任何方式启动)。如果你正在开发一个库,你不需要一个
main
作为库本身,但是没有main
你就不能把它变成一个可执行文件(除非使用不可移植的技巧),而且,至少,你应该有一个用于测试套件。换句话说,你的库应该有一个由
main
函数控制的大型测试套件(很可能在一个或多个单独的源文件中),这样你就可以测试任何新的工作和回归测试,以确保它没有塞满旧的工作。bgibtngc4#
一个程序需要一个入口点来明确你的程序从哪里开始,没有入口点,你的工具就不可能知道应该先调用哪个函数。
可以将另一个函数指定为入口点,但是通过使用main,读取您代码的每个人都将知道程序从哪里开始。
通常,在开发库时,你会把main放在一个单独的程序中,并以此作为测试库的起点。
wgx48brx5#
正常情况下
main()
是启动本身。如果你忽略了main()
它需要任何启动器来执行程序。基本上主要是一个标识符,当一个程序被执行时由编译器识别。xmakbtuz6#
main是执行你的程序所必需的。当你试图执行一个用C写的程序时,它会转到main函数并从这里执行。如果你正在写一个库,你最好写一个简单的测试代码来调用你的库函数,然后编译并运行那个测试程序来测试你的库
p8ekf7hl7#
从形式上讲,这是一个加载器的要求,而不是编译器。程序员会知道每个程序在执行之前都应该被加载到一个上下文中。这是加载器的责任,但如果没有定义“入口点”的标准,加载器就不知道哪一行代码是入口点。
gstyhher8#
要访问stdio. h中的元素,我们需要一个函数,main函数是接受/调用所有其他函数的预定义函数