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

Wes*_*ler 7 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

记住,这是AC问题.没有C++!

jus*_*tin 4

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

typedef struct {
 port_t port;
 timeout_t timeout;
 sockaddr_t sockaddr;
 etc_t etc;
} my_stuff;
Run Code Online (Sandbox Code Playgroud)

然后通过引用传递它:

void Foo(my_stuff*);
Run Code Online (Sandbox Code Playgroud)

我想一个可以进行 malloc 分配并传递的结构可以工作。我应该有一个 cleanup() 来关闭套接字并释放内存。

一般来说,结构体并不总是需要进行malloc'ed 操作。但是,是的,这可能是需要的情况。

  • @WesMiller:您可以将其放在外部作用域的堆栈上。所以 `int main() {my_stuff stuff; 东西.端口 = 80; ...; Foo(&stuff); ...; 返回0;}`。函数中的静态变量实际上是全局的,并且存在类似的问题。 (2认同)
  • 一种风格注意事项 - 不要使用“结构”来收集其他不相关的属性,只是为了避免传递多个参数。在这种情况下,将端口、超时、sockaddr 和其他与连接相关的参数等属性收集到单个“struct”类型中是有意义的,因为它们都与相同的操作相关。但是,如果你有一堆不相关的属性,最好将它们作为单独的参数传递(并且可能仔细看看你的函数正在做什么;将其分成几个更小的属性可能是有意义的)函数代替)。 (2认同)