如何在c中不使用全局变量

时间:2013-07-08 21:43:51

标签: c struct global-variables

我已经阅读了墙上的文字,避免全球。这导致了一个明显的问题,如何最好地做到这一点?

我显然想用当前项目来做。目标是让远程PC向已经拥有stdin阅读器的应用程序发送“击键”。我们的想法是让现有的代码检测到没有待处理的按键,然后检查是否有“udp按键”,如果是,则将其填入所以它似乎是键盘输入。微创,不需要在其他人的代码中进行改装。

所以我拼凑了一个小的UDP套接字读取器,它使用setup()函数打开并绑定端口,然后在一个使用非阻塞service()一次的循环中的select()函数,没有循环,只需检查是否有任何东西要立即阅读 。如果是这样,请从套接字读取数据并对其执行某些操作,否则返回0。

// pseudo c
char c;

setup();
while (1)
{
   c = check_for_keyboard_entry();
   if ( c == 0 )
      c = service();
   handle_keypress( c );
   do_a_bunch_of_other_stuff();
}

显而易见的方法是使用几个全局变量来传输两个函数之间的端口,超时,sockaddr等。但是,你应该使用全局,对吗?

那么在函数之间转移六个或八个变量的首选方法是什么?

如果我在setup()中使用静态变量,它们是否可以通过service()例程访问?

我认为一个获得malloc-ed并传递的结构会起作用。我应该有cleanup()关闭套接字并释放内存。

记住,这是一个C问题。没有C ++!

1 个答案:

答案 0 :(得分:3)

您可以将所有信息打包到struct。结构可以是客户端可见的,也可以是opaque类型。 opaque类型可能是更好的选择,因此您可以隐藏复杂类型的数据(封装)。

typedef struct {
 port_t port;
 timeout_t timeout;
 sockaddr_t sockaddr;
 etc_t etc;
} my_stuff;

然后通过引用传递它:

void Foo(my_stuff*);
  

我认为一个获得malloc-ed并传递的结构会起作用。我应该有一个cleanup()来关闭套接字并释放内存。

通常,结构不一定需要malloc。但是,是的,这可能是需要它的情况。