【问题标题】:Accessing a variable outside a c file访问c文件外的变量
【发布时间】:2022-11-14 02:47:10
【问题描述】:

我正在尝试执行此代码,并将其拆分为 .c 文件(比如说 file1.cfile2.c)和 file1.h 文件。我不允许更改可以发送给函数的参数,因此我需要找到另一种方法来“发送”/访问另一个变量。我试图在头文件file1.h 中将变量设为静态,并将其包含在file2.c 中。 file1.c 中的函数如下所示:

int function(int *array, int a, int b){
        ...
        ...
    if(global_variable == 1){
        point = array[(a+b)/2];
    }else if(global_variable == 0){
        point = array[b];
    }
    

file2.c 我有一个类似这样的函数:

double function2(t_sort_funcp fun, const case_t c, int array_length, result_t *buf, t_generate_array_funcp g_array){
    int array[array_length];
    switch (c)
    {
    case first:
        global_variable = 1;
        g_array(array, array_length);
        return debugg(fun, array, array_length);
        break;
    case second:// Wors case is an inverted sorted array.
        global_variable = 0;
        g_array(array, array_length);
        return debugg(fun, array, array_length);
        break;
    case third:
        global_variable = 1;
        g_array(array, array_length);
        return debugg(fun, array, array_length);
        break;
    }
    return 0;
}

file1.h 我有:

#ifndef ALGORITHM_H
#define ALGORITHM_H

#include <stdbool.h> // bool
static int global_variable;

#endif

如您所见,我正在尝试更改file2.c 中的global_variable 变量并在file1.c 中使用它,但这不起作用,file1.c 中的 if 语句总是执行 else 语句中的代码,即使我将变量更改为 1。 注意:file2.c 总是在 file1.c 之前执行

【问题讨论】:

  • 您应该在其中一个.c 文件中将int global_variable; 定义为全局,并将.h 文件更改为extern int global_variable;。仅将类型和声明放在 .h 文件中。
  • .h 文件中的标头保护不会阻止每个 .c 文件编译包括它。它们是独立编译的。 static 关键字将范围限制为该文件。因此,在您的代码中,每个 .c 文件都有自己的名为 global_variable 的变量,仅在该编译单元中可见。

标签: c function global-variables header-files


【解决方案1】:

反其道而行之

#ifndef ALGORITHM_H
#define ALGORITHM_H

#include <stdbool.h> // bool
extern int global_variable;

#endif

在 .c 文件之一中

int global_variable;

在需要访问此变量的所有文件中包含 .h 文件。

全局范围内的static 使变量仅在一个编译单元(文件)中可用。

【讨论】:

    【解决方案2】:

    您可以将externcpp 条件结合使用。

    以下是示例文件。


    文件:file1.h

    #ifndef ALGORITHM_H
    #define ALGORITHM_H
    
    #include <stdbool.h> // bool
    
    #ifdef FILE1_C
    int global_variable;
    #else
    extern int global_variable;
    #endif
    
    #endif
    

    文件:file1.c

    // I am file1.c
    #define FILE1_C
    #include "file1.h"
    

    文件:file2.c

    // I am file2.c
    #include "file1.h"
    

    【讨论】:

    • 绝对是错误的方式。为什么会出现这种奇怪的 ifdef 并发症?在.h文件中声明,在.c文件中定义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多