共享从main到另一个c文件的变量

时间:2016-06-03 18:45:00

标签: c

我有一个功能

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();
}

3 个答案:

答案 0 :(得分:1)

  

我想知道如何在InsertToList函数中使用FileName字符串而不将其传递给参数,也不使用全局变量。

  1. static
  2. 中创建一个文件范围main.c变量
  3. main.c
  4. 中设置值
  5. main.c中提供一个函数以返回该值。
  6. 使用InsertToList
  7. 中的功能

    的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类型,其中包含您要交换的所有数据的成员,并传递这样的结构,或者指向一个的指针,作为函数参数。