将变量声明放在单独的函数中C

问题描述:

是否可以将变量声明放入外部函数中? WikipediaWikipedia读取后:将变量声明放在单独的函数中C

内联函数是一个函数,编译器被请求执行内联扩展。换句话说,程序员已经要求编译器在函数被调用的每个地方插入函数的完整主体,而不是生成代码来在定义的地方调用函数。

我假设以下可能有效。它没有多久,编译器就打我的手指:(

inline void declaration(){ 
    int a; 
} 

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

该*文章中的关键字是**请求**。 'inline'并不要求编译器根据你的要求去做,它只是一个建议。因此,内联函数必须都具有非内联语义。 – 2012-03-08 08:07:53

+0

关于'inline',值得注意的是,gcc实现了多个不同版本的内联扩展,取决于你是否要求C99语义或gnu89语义等等。这有点乱。 – torek 2012-03-08 11:21:33

这可能不是如何完成的,但如果您想了解如何考虑内联函数时会发生什么的基本概念。

想象一下编译器将你的代码变成这样的东西,然后你明白为什么它不起作用。

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

declaration()该呼叫由包括括号内的函数的内容替代,由此int a;在内部范围被声明,而不是在主函数可见。

+1

+1,但当然,你也不能'转到'内联函数。 – asaelr 2012-03-08 09:06:40

否 - 据我所知inline函数的行为必须等同于非内联函数语义;它不影响法律的代码最重要的。这只是一个优化。

特别是,你可以一个在函数调用a变量,但他们会在堆栈上不同的变量。

(即使你可能做到这一点,我认为这将是一个非常糟糕的想法在可读性方面。)

不,这是不可能的。

什么是可能的,是使用预处理指令#define

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

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

这将是一个不好的做法。而且这些仍然是变量,只有在它被放置的函数范围内才可用,没有值被共享。

内联函数通常只是一个包含不超过4行的函数,并且您希望编译器在您谈论的地方进行优化,因为执行该函数时会更快,而不是添加额外的代码。

内联扩展用于消除函数调用时的时间开销。它通常用于频繁执行的功能。

所以没有什么特别的内联函数,而不是编译器可以处理的不同。他们不会与任何其他函数共享他们的堆栈,这将是主要使用在不同范围内创建的变量的唯一方法。

所以我的建议是;编写你的函数,并按照你通常的方式对待它们。然后,当你完成时,将你使用的很短的那些内联。

如果你真的想在另一个函数创建一个变量,它分配在功能堆,并返回您保存,然后设置为2(你的情况)的指针。 :)只记得释放内存!

你可以做到这一点,虽然:

#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多个独立实例。