C适当使用全球变量

Opt*_*Pwn 2 c shell program-entry-point arguments global-variables

我正在C中构建一个minishell,并且已经出现了一个障碍,似乎可以通过使用全局变量(确切地说是3)来轻松修复它.我认为全局变量是必要的原因是,替代方案是将这些变量传递给程序中的几乎每个函数.

变量是mainargc,mainargv和shiftedMArgV.前两个是参数的数量,并且参数列表分别传递给main.变量shiftMrgV是参数列表,但它可能已被移位.我正在尝试创建内置函数shift和unshift,并将shiftMrgV指向不同的参数.

那么,让这些全球变得愚蠢是不是很愚蠢?否则我将不得不修改大量的代码,而且我不确定通过使它们全局化而失去任何东西.

如果我确实将它们设为全局,那么从主头文件中这样做是愚蠢的吗?

感谢帮助人员,如果您需要任何澄清,请询问.

Jon*_*ler 5

作为全局变量的替代方案,请考虑"全局函数":

extern int    msh_mainArgC(void);
extern char **msh_mainArgV(void);
extern char **msh_shiftedArgV(void);
Run Code Online (Sandbox Code Playgroud)

这些函数的实现很简单,但它允许您控制对内存的访问.如果你需要做一些奇特的事情,你可以改变功能的实现.(我选择大写C和V以使差异更明显;当只有8-12字母名称的最后一个字符不同时,更难发现差异.)

有一个实现文件可以定义这些函数.在该文件中,存在存储相关信息的静态变量,以及用于设置和操纵变量的函数.原则上,如果你打了足够的const限定符,你可以确保调用代码不能修改数据,除非通过设计的函数(或通过使用强制转换来删除常量).

这对你来说是否值得讨论是值得商榷的.但它可能是.它更接近"面向对象"的运作方式.它是一种考虑然后丢弃的替代方案,而不是不考虑的东西.

请注意,使用这些函数的子系统可能具有一个收集全局值的函数,然后将这些函数传递给其从属函数.这使得下属不必知道值的来源; 只是正确地操作它们.如果存在全局变量,则必须担心别名 - 是函数传递的值(全局变量的副本),但它是否也访问全局变量.使用这些功能,您不必以同样的方式担心.