Почему мы не можем определить функцию внутри главной функции?

c

9387 просмотра

3 ответа

21594 Репутация автора

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

In function `n':
(.text+0xa): undefined reference to `m'
error: ld returned 1 exit status

Почему я получаю ошибку? Пожалуйста, объясни.

Код здесь:

#include <stdio.h>
void m();
void n()
{
    m();
}

void main()
{
    n();
    void m()
    {
        printf("hi");
    }
}
Автор: msc Источник Размещён: 18.07.2016 06:52

Ответы (3)


5 плюса

1467 Репутация автора

Вы не можете реализовать функцию в рамках другой функции в стандарте C. Переместите реализацию m()из своей основной.

Код, который вы разместили, не должен компилироваться вообще; Тем не менее, ошибка, которую вы получаете, потому что компоновщик ldне может найти реализацию m. Функцию можно использовать, потому что вы объявили ее, но реализация отсутствует и, следовательно, не может быть связана.

Также обратите внимание, что ваша mainфункция должна возвращать значение типа int. Использование voidзаставит вашу программу вернуть произвольное значение, из которого операционная система / оболочка не может определить, было ли выполнение успешным.

#include <stdio.h>

void m();

void n() {
    m();
}

int main() {
    n();
    return 0;
}

void m() {
    printf("hi");
}
Автор: maxdev Размещён: 18.07.2016 06:54

0 плюса

1 Репутация автора

Переместите объявление функции за m()пределы main()метода.

Автор: Rommel Размещён: 18.07.2016 07:03

3 плюса

75039 Репутация автора

Решение

mопределяется внутри main. В стандарте C это запрещено (вы не можете определить функцию в другой функции).

Некоторые компиляторы (например, gcc) допускают это как расширение. Но тогда функция является локальной , то есть mсуществует только внутри mainи не видна снаружи. Точно так же переменные, определенные в функции, являются локальными для этой функции и не могут быть видны снаружи.

Ваше void m();объявление вверху утверждает, что вызываемая (глобальная) функция mсуществует, но это не так. Вот почему вы получаете ошибку компоновщика.

Автор: melpomene Размещён: 18.07.2016 07:12
Вопросы из категории :
32x32