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



我读过墙上写的"避免全局参数"。这就引出了一个显而易见的问题,如何最好地做到这一点?

我显然想用当前的项目来做这件事。目标是让远程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处理并传递的结构会起作用。我应该有一个cleanup()来关闭套接字并释放内存。

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

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

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

然后通过引用传递:

void Foo(my_stuff*);

我想一个经过malloc处理并传递的结构会起作用。我应该有一个cleanup()来关闭套接字并释放内存。

一般来说,结构并不总是需要malloc’ed。但是的,这可能是一种需要的情况。

相关内容

  • 没有找到相关文章