Вызов функции, которая объявлена ​​под текущей функцией - PullRequest
0 голосов
/ 31 июля 2009

Я новичок в C, и у меня возникла проблема при попытке вызвать функцию, которая объявлена ​​в текущей функции Пример:

void test (){ test1 ();}
void test1(){ }

Я мог бы просто переместить test1 выше test, но у меня также есть это:

void test () {test1 ()}
void test4 () {test ()}
void test3 () {test4 ()}
void test1 () {test3 ()}

Так вы видите, что если я переместлю test (), у меня возникнет та же проблема для test4 ()? Что я мог сделать?

Спасибо

Ответы [ 5 ]

5 голосов
/ 31 июля 2009

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

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

Например, вы можете создать прототип test1 со следующим

void test1();

Тогда вы можете позвонить до того, как он будет определен

void test1();
void test() { test1(); }
void test1() {}
2 голосов
/ 31 июля 2009

Что вам нужно сделать, это «объявить вперед» ваши функции перед их определением. Как в:

// Declarations
void test();
void test1();

// Definitions
void test()
{ 
   // definition using test1
}

void test1()
{
   // definition using test
}
1 голос
/ 31 июля 2009
void test();
void test1();
void test3();
void test4();

void test () {test1 ()}
void test4 () {test ()}
void test3 () {test4 ()}
void test1 () {test3 ()}

В C вы не можете использовать функцию, если она не определена до вашей функции. Вот как работает С. В большинстве других языков об этом заботится компилятор. Это называется предварительным объявлением. Вы просто сообщаете компилятору, если видите, что test, test1, test3, test4 в моем коде не выдают ошибку, потому что эти функции определены в другом месте, а не перед моей функцией.

0 голосов
/ 31 июля 2009

вы сначала даете компилятору знать, что функция существует:)

0 голосов
/ 31 июля 2009

Вы можете объявить прототипы функций:

void test();
void test1();
void test3();
void test4();

void test () {test1 ();}
void test4 () {test ();}
void test3 () {test4 ();}
void test1 () {test3 ();}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...