【发布时间】:2018-03-25 04:32:56
【问题描述】:
有没有办法让静态变量在 C/C++ 中有多个副本?
以下代码有一个静态变量 - 英里。如何实现 runner1() 和 runner2() 有自己的里程副本但保持里程为静态?
测试.h
static int miles;
extern int get_miles();
test.c
#include "test.h"
int get_miles() {
miles = miles + 1;
return miles;
}
用户.c
#include <stdio.h>
#include "test.h"
extern void runner1();
extern void runner2();
void runner1() {
int i;
for(i=0;i<5;i++) {
printf("runner1 runs %0d miles\n", get_miles());
}
}
void runner2() {
int j;
for(j=0;j<5;j++) {
printf("runner2 runs %0d miles\n", get_miles());
}
}
int main() {
runner1();
runner2();
}
【问题讨论】:
-
您必须将
runner1()和runner2()放在不同的文件中,并且每个文件都需要自己的get_miles()(在同一个文件中)。但感觉这里有一个XY Problem。你为什么要这样做?至少看起来有些荒谬。 (顺便说一句,%0d也可能是%d。)此外,您应该选择两种语言中的一种:C++ 中存在一些不属于 C 的选项。 -
使用两个函数,get_miles1() 和 get_miles2(),以及两个静态计数器。
-
一个
static变量中不能同时有两个不同的值。 -
所以...你想要相同的函数
get_miles(),不带参数,在runner2调用时做不同的事情而不是从runner1调用? -
这将是很容易破坏的非常脆弱的代码。在 .h 文件中声明静态是一个非常糟糕的主意。 .h 文件的重点是为 .c 文件提供一种可靠的方式来保证它们都同意通用符号。这就是外部定义的所在;静态定义(本质上是 .c 文件的本地)属于 .c 文件。我不明白为什么当您为每个跑步者制定例行程序时,您为什么要将里程保持为任何形式的全球性;也不是为什么您希望该变量是静态的。为什么不在 runner1()/runner2() 中打印 i 和 j?模块化编码让生活变得轻松