2012-06-14 4 views
0

если я:Функции внутри функции

void foo() { 
    if(..) { 
     inline int baa(..) { return .. } 
    } else { 
     inline int baa(..) { return .. } 
    } 

} 

И позвони: baa(..) внутри foo функции я получаю implicit declaration of 'baa'. Но если я делаю объявление прототипа: inline int baa(int); ошибка inline function 'baa' declared but never defined. Я использую встроенную функцию для замены макрофункции.

Как это исправить?

EDIT лучше: может кто-нибудь объяснить, почему компилятор утверждает вышеупомянутое сообщение об ошибке?

+0

дубликата: http://stackoverflow.com/questions/957592/functions-inside-functions-in-c –

ответ

4

Я использую встроенную функцию для замены макрофункции.

Вы не можете определить функции внутри функций, вы можете только объявить их. Объявление их делает их имена видимыми в этой области, но эти функции все еще нуждаются в определении где-то, и мы знаем, что мы не можем определить их в рамках другой функции. Вот почему компилятор говорит, что функция была объявлена ​​, но никогда не определена.

Вместо этого просто объявить ваши функции inline в глобальном масштабе.

+0

+1: абсолютно правильно :) – paulsm4

+0

когда вы говорите «объявляете свои функции inline в глобальной области», вы имели в виду «void myfunction()» или «void myfunction() {..}». Но так или иначе, в этом случае 'baa' объявляется динамически зависимым от условия if-else. Это попытка заменить на 'if (..) #define foo (x) .. else #define foo (y)', который не работает для макросов. – Jack

+0

@Jack: 'void myfunction()' является _declaration_, 'void myfunction() {...}' является _definition_. «# Define» внутри 'if' не охраняется условным, поэтому ваша функция не объявляется динамически. На самом деле, препроцессор _C ничего не знает о 'if',' else' или какой-либо другой конструкции из языка _C _ ... –

1

Хотя это не является частью стандарта, вы можете скомпилировать с флагом -fnested-functions

+0

hm .. это для GCC? не работает для меня (я использую MinGW): 'unrecognzided command line option -fnested-functions' – Jack

+0

Он недоступен для gcc на windows.But ваш ответ еще не закончен! Спасибо и +1. – Jack

1

K-Балло предложение в самом деле, кажется, лучше всего, но он на самом деле не указывает на проблему.

Вложенная функция, определенная в блоке, действительна только внутри блока. Точно так же, как нормальная переменная. Вы определяете одну функцию в предложении if, а другое - в предложении else, и каждый из них действителен в этом предложении. Но ни один из них не действует после закрытия if-else.

Это точно так же с переменными:

if (a) { 
    int x = 3; 
} else { 
    int x = 4; 
} 
// x isn't valid here. 
Смежные вопросы