Почему главное необходимо в программе - PullRequest
3 голосов
/ 24 ноября 2010

Я сделал программу, которая все еще находится в разработке.Я не объявлял main в своей программе преднамеренно. Поскольку я разрабатываю библиотеку для создания графиков и другой алгоритм, который я буду использовать в своих программах. Цель разработки такой библиотеки на C - это работать над проблемами, изложенными в книге ВведениеАлгоритмы Томас Х 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;
}

Когда я скомпилировал вышеупомянутую программу, я получил следующую ошибку.почему я должен объявить main в моей программе?

Ответы [ 7 ]

14 голосов
/ 24 ноября 2010

По умолчанию gcc (и большинство компиляторов C) компилируются и ссылаются на автономный исполняемый файл.Функция main() необходима для того, чтобы код запуска знал, с чего должно начинаться выполнение вашего кода.

Чтобы скомпилировать код вашей библиотеки без ссылок, используйте gcc -c graph.c.В этом случае graph.c не требует функции main().

5 голосов
/ 24 ноября 2010

main обязательно присутствует, если вы встраиваете свой код в приложение, поскольку основные функции служат точкой входа для приложения.

Но если ваш код создается как lib, то main не нужен.

РЕДАКТИРОВАТЬ: Проверьте это для получения информации о статических и общих библиотеках.

4 голосов
/ 24 ноября 2010

Почему?Так как в стандарте говорится так (в основном).

Функция main требуется для среды C на хосте (автономные среды могут запускаться так, как им нравится).

Если выПри разработке библиотеки вам не понадобится main для самой библиотеки, но вы не сможете превратить ее в исполняемый файл без нее (кроме как с помощью непереносимого трюка).И, как минимум, в любом случае у вас должен быть один для набора тестов.

Другими словами, ваша библиотека должна иметь большой набор тестов, который управляется из функции main (скорее всего, в отдельнойисходный файл или файлы), чтобы вы могли протестировать любую новую работу и регрессионный тест, чтобы убедиться, что она не заполнила старую работу.

1 голос
/ 07 ноября 2013

обычно main() сам по себе запускается.если вы игнорируете main(), для запуска программы необходим стартер.в основном main - это идентификатор, который определяется компилятором при выполнении программы.

1 голос
/ 24 ноября 2010

Программа нуждается в точке входа, чтобы уточнить, где ваша программа запускается. Без этого ваши инструменты не смогут узнать, какая функция должна быть вызвана первой.

Можно указать другую функцию в качестве точки входа, но с помощью main все, кто читает ваш код, будут знать, где запускается ваша программа.

Обычно при разработке библиотек вы помещаете main в отдельную программу и используете ее в качестве отправной точки при тестировании вашей библиотеки. Как то так:

gcc -o library.o -c library.c
gcc -o main.o -c main.c
gcc -o testprogram library.o main.o
0 голосов
/ 24 ноября 2010

Формально это требование загрузчика, а не компилятора. Программист должен знать, что каждая программа ДОЛЖНА быть загружена в контекст перед ее выполнением. Это ответственность загрузчиков, но загрузчики не знают, какая строка кода является точкой входа, если нет стандарта для определения «точки входа».

0 голосов
/ 24 ноября 2010

main необходимо выполнить вашу программу. Когда вы пытаетесь выполнить программу, написанную на C, она переходит к основной функции и запускается отсюда. Если вы пишете библиотеку, как вы сказали, вам лучше написать простой тестовый код для вызова функций вашей библиотеки и скомпилировать и запустить эту тестовую программу для тестирования вашей библиотеки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...