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

时间:2012-03-08 06:58:22

标签: c

是否可以将变量声明放在外部函数中?在阅读Wikipedia之后:

  

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

我假设以下可能有效。编译器敲击我的手指没多久:(

inline void declaration(){
    int a;
}

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

5 个答案:

答案 0 :(得分:4)

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

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

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

declaration()的调用被包含括号的函数内容所取代,因此int a;在内部作用域中声明,在主函数中不可见。

答案 1 :(得分:2)

不,这是不可能的。

可能的是使用预处理器指令#define

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

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

这是一种不好的做法。此外,这些变量仍然只是在函数范围内可用的变量,而不会共享值。

答案 2 :(得分:1)

否 - 据我所知,内联函数必须表现为语义等效于非内联函数;它不会影响合法代码。这只是一个优化。

特别是,可能两个函数中都有一个名为a的变量,但它们是堆栈中的单独变量。

(即使你可以这样做,我建议在可读性方面这是个坏主意。)

答案 3 :(得分:0)

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

  

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

因此内联函数并没有什么特别之处,而是编译器可能会对它进行不同的处理。它们不与任何其他函数共享它们的堆栈,这将是main使用在不同范围内创建的变量的唯一方法。

所以我的小费是;写下你的功能,并按照你的意愿对待它们。然后,当你完成后,内联你经常使用的短的。

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

答案 4 :(得分: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的多个独立实例头文件)。