【问题标题】:Making function behave like a scope使函数表现得像一个范围
【发布时间】:2013-07-25 05:02:29
【问题描述】:

我正在做一个越来越复杂的项目。项目由相互独立的代码部分组成,其中包含大量数学计算,然后是复杂的输出生成。所有这些都用 pthread 包裹在一个套接字中。

整个事情看起来像这样:

Main() -> 套接字 -> 线程 -> 请求处理 -> 一个或多个独立部分

我想将每个独立的代码部分包含在一个函数中,并让该函数从调用者函数继承变量,但这不起作用。

以下是我想要实现的简化版本:

void func_a(){int c;b+=a;c=1;b+=c;}
int main(){
 int a,b,c;
 a=3;b=2;c=0;
 func_a();
 printf("b:%d c:%d\n",b,c);
 return 1;
}

上面的代码不工作,但这个工作正常,做我想做的事:

int main(){
 int a,b,c;
 a=3;b=2;c=0;
 {int c;b+=a;c=1;b+=c;}
 printf("b:%d c:%d\n",b,c);
 return 1;
}

我可以将函数代码放入文件中,然后执行 { #include ... },但也许有更好的方法来做到这一点?

对于管理此类事情的任何其他想法和建议也表示赞赏。

谢谢。

附言

由于线程,使用全局范围不是一个选项。仅将变量传递给函数不是一种选择,它将需要 30 多个参数。我已经有一堆结构在运行,所以将所有变量放入单个结构中并不是一个选项。

【问题讨论】:

  • 如果您不关心可移植性,那么您可以考虑使用 gcc 的嵌套函数支持。
  • 使用 GCC 本地函数定义。

标签: c function scope


【解决方案1】:

有多种方法可以实现您的需求。

首先是使用gcc 嵌套函数。不幸的是,它们是非标准的,因此完全依赖于编译器。你可以在这里找到一些信息:Stack Overflow nested C functionGCC Nested functions manual。如果您不需要可移植性,这可能是一个有效的解决方案。

另一种解决方案可能是使用伪函数的代码定义一个宏。每次调用宏时,编译器都会进行替换,并自动继承调用者函数中定义的变量。

我用这两种解决方案重写了您的示例。

#include <stdio.h>

#define FUNC_A()  {int c;b+=a;c=1;b+=c;} 
#define FUNC_A2(_a,_b) {int c;_b+=_a;c=1;_b+=c;} 

int main(){
   int a,b,c;
   void func_a(){int c;b+=a;c=1;b+=c;}

   // nested solution
    a=3;b=2;c=0;
    func_a();
    printf("b:%d c:%d\n",b,c);

    // macro solution
    a=3;b=2;c=0; 
    FUNC_A(); 
    printf("b:%d c:%d\n",b,c);

    // macro solution
    a=3;b=2;c=0; 
    FUNC_A2(a,b);
    printf("b:%d c:%d\n",b,c);

    return 0;
}

所有解决方案都有相同的结果。 :D

【讨论】:

  • 我尝试使用函数的原因之一是因为我期望编译器有更好的时间优化重复代码。我想坚持一个标准,所以对编译器如何优化重复范围有什么想法吗?
  • 使用宏的解决方案,编译器将优化您的代码,就好像它是在调用函数中编写的一样。因此,您避免了调用函数的所有开销(推送/弹出参数,堆栈中的地址)。如果您在宏之前使用变量,然后在宏中使用相同的变量,则编译器足够聪明,可以将其保存在寄存器中,而无需进入内存。如果您担心性能,MACROS 肯定不会影响您的性能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2012-01-15
相关资源
最近更新 更多