2012-03-08 2 views
0

Можно ли поместить объявления переменных во внешнюю функцию? После прочтения от Wikipedia что:Помещение объявлений переменных в отдельную функцию в C

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

Я предположил, что следующее может работать. Это не не займет много времени для компилятора, чтобы хлопнуть мои пальцы :(

inline void declaration(){ 
    int a; 
} 

int main(){ 
    declaration(); 
    a=2; 
    return 0; 
} 
+2

Ключевое слово в этой статье в Википедии ** запрошено **. 'inline' не требует * компилятора делать то, что вы просите, это всего лишь предложение. Таким образом, встроенные функции должны иметь не-встроенную семантику. –

+0

Стоит отметить, что в отношении 'inline' gcc реализует несколько разных версий встроенного расширения, в зависимости от того, запрашиваете ли вы семантику C99 или семантику gnu89 и т. Д. Это своего рода беспорядок. – torek

ответ

4

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

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

int main(){ 
    { 
     int a; 
    } 
    a=2; 
    return 0; 
} 

Вызов declaration() заменяется содержимым функции, включая скобки, таким образом, int a; объявляется во внутреннем объеме и не виден в главной функции.

+1

+1, но, конечно, вы также не можете «перейти» в встроенную функцию. – asaelr

1

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

в частности, вы могли иметь переменную a в обоего функций, но они были бы отдельной переменными в стеке.

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

2

Нет, это невозможно.

Что можно, это использовать директиву препроцессора #define:

#define VARBLOCK int a, b, c; char ca, cb, cc; 

int main() 
{ 
    VARBLOCK; 
    a = 2; 
} 

Это будет плохая практика. Кроме того, они все равно будут переменными, доступными только в области функций, где они были размещены, без совместного использования значений.

0

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

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

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

Так что мой совет; пишите свои функции и относитесь к ним, как обычно. Затем, когда вы закончите, вставьте короткие, которые вы используете много.

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

0

Вы можете сделать это, хотя:

#include <stdio.h> 

int* GetMyIntAddress(void) 
{ 
    static int blah = 0; 
    return &blah; 
} 

int main(void) 
{ 
    printf("%d\n", *GetMyIntAddress()); 
    *GetMyIntAddress() = 123; 
    printf("%d\n", *GetMyIntAddress()); 
    return 0; 
} 

blah будет глобальная переменная, определенная в области видимости функции GetMyIntAddress().

Если добавить inline к определению GetMyIntAddress(), вы рискуете получить несколько независимых экземпляров blah если встраиваемая функция используется в различных модулях (например, включенных в общий файл заголовка).

Смежные вопросы