c - 在 C 中使用 extern 无法按预期工作

标签 c makefile extern

我创建了两个文件:

可调参数.h

#ifndef TUNABLES_H
#define TUNABLES_H

void tunables_load_conservative();
void tunables_load_aggressive();

extern int timer_x;
#endif /*TUNABLES_H */

和可调参数.c

#include "tunables.h"

int timer_x;

void tunables_load_conservative(){
     timer_x = 3;
}
void tunables_load_aggressive(){
     timer_x = 1;
}

我的项目的所有其他文件都包括“tunables.h”。当我加载项目时,A.c 和 B.c 都会调用 tunables_load_conservative 但如果一段时间后,我在文件 B.c 中调用文件 A.c tunables_load_aggressive() timer_x 仍然是 3。为什么?

这是我的 Makefile:

INCLUDE=`pwd`/include
GCCFLAGS= -ansi -O3 -pedantic -Wall -Wunused -I${INCLUDE} -DDEBUG 
GCCOTHERFLAGS= -ggdb -pg

all: A B

A: A.o tunables.o
    gcc -o A ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.o

B: B.o tunables.o
    gcc -o LBfixed ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.o

A.o: A.c
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} A.c

B.o: B.c
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} B.c

tunables.o: tunables.c
    gcc -c ${GCCFLAGS} ${GCCOTHERFLAGS} tunables.c

clean:
    rm -rf *.o A B

最佳答案

看起来您有两个独立的进程,A 和 B。extern 声明不会跨进程设置共享内存,而是允许同一进程内使用不同的编译单元 访问相同的变量。

要跨进程共享变量,您需要使用系统相关的 IPC 方法。

关于c - 在 C 中使用 extern 无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1695898/

相关文章:

c - 如何编译静态libwebscocket.a

c++ - typedef 和函数声明错误

java - 在 autoconf 或 makefile 中禁用版本后缀/扩展

linux - Makefile 没有按预期执行命令

c++ - 使用 extern "C"的潜在缺点是什么?

c - 将匹配的字符存储在flex中

c - 将指针传递给函数

c++ - 使用带参数和 extern 关键字的构造函数

bash - 在 bash 中选择不同的可执行文件

C++ 全局外部 "C" friend 无法访问命名空间类上的私有(private)成员