7

我读过墙上的文字,Avoid Globals。这导致了一个明显的问题,如何最好地做到这一点?

我显然想用当前的项目来做。目标是让远程 PC 向已经有标准输入读取器的应用程序发送“击键”。这个想法是让现有代码检测到没有挂起的击键,然后检查是否有“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++!

4

1 回答 1

4

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

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

然后通过引用传递它:

void Foo(my_stuff*);

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

通常,结构并不总是需要被malloc'ed。但是,是的,这可能是需要的情况。

于 2013-07-08T21:54:58.130 回答