我有一个功能
int InsertToList(List **head,......,char *FileName);
此功能在Source1.c中实现
但是,此FileName字符串取自命令行参数,并在同一项目的Main.c中的main函数内声明
我想知道如何在InsertToList函数中使用FileName字符串而不将其传递给参数并且不使用全局变量?
我的意思是:
int InsertToList(List **head,......)
{
File *fp;
fp = fopen(FileName,"r"); // here FileName is passed from the main in Main.c
doSomething();
}
答案 0 :(得分:1)
我想知道如何在InsertToList函数中使用FileName字符串而不将其传递给参数,也不使用全局变量。
static
。main.c
变量
main.c
。main.c
中提供一个函数以返回该值。InsertToList
。的main.c
static char* fileName;
char* getFileName()
{
return fileName;
}
int main(int argc, char** argv)
{
fileName = ...;
}
Source1.c:
// Provide a declaration of the function that's defined in main.c.
char* getFileName();
int InsertToList(List **head,...)
{
File *fp;
fp = fopen(getFileName(),"r");
}
答案 1 :(得分:0)
你做不到。如果希望函数具有共享状态,则必须通过调用参数传递它,或者必须访问共享符号,换句话说是全局变量。
即使对于同一文件中的函数也是如此。
答案 2 :(得分:0)
在函数之间传递数据有各种各样的方法,但全局变量和函数参数是两个主要的方法。对于其主体出现在同一源文件中的函数,还有static
个文件范围变量,它们不完全是全局,但具有相似的风格;但是,这不适用于您描述的情况。
我可以理解想要避免全局变量,事实上我为此赞扬你,但为此目的避免函数参数是......奇怪的。 @RSahu建议使用带有访问函数的static
变量;如果您认为static
文件范围变量不同于全局且因此允许,那么这可能是您的最佳选择。否则,您的选项就像一个函数将数据写入一个具有已知名称的文件,另一个函数从那里读回来。大多数此类替代方案比全局变量更糟糕。
如果你有多个线程或多个进程,那么管道可能是一个可行的选择,但是你没有说什么来暗示这种情况。
如果您只想最小化函数参数的数量,那么考虑定义一个struct
类型,其中包含您要交换的所有数据的成员,并传递这样的结构,或者指向一个的指针,作为函数参数。