为什么我的 main.c 文件没有得到这个全局静态变量的更新值?
Why is my main.c file not getting updated values on this global static variable?
我正在构建一个基本的纸牌游戏,为此我必须创建一副纸牌(虽然不是一副普通的纸牌)并洗牌。它在 Visual Studio (Windows 10) 上工作得很好,但是一旦我切换到 Xcode (Mac OS X 10.11.16),我就不能似乎得到相同的结果。
这是我的 main.c,引用了我的 .h 文件:
#include "Card.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
Card* lst = NULL;
if(CRD_createDeck(lst) != CRD_retCondOK)
printf("Something is wrong\n");
CRD_showDeck(b);
if(b == NULL)
printf("Empty\n");
return 0;
}
我的 Card.h 文件定义了 Card* b:
static Card* b;
还有我的 Card.c 文件:
#include "Card.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
CRD_tpRetCond CRD_createDeck(Card* lst){
int numCards, numSuits, CardEnum = 1;
char vetCardName[10] = {'4', '5', '6', '7', 'Q', 'J', 'K', 'A', '2', '3'};
char vetCardSuit[4][8] = {"Ouros", "Espadas", "Copas", "Paus"};
/*
lst = CRD_createList();
if(lst != NULL)
return CRD_retCondCreateError;*/
CardInfo* generico;
for(numSuits = 4; numSuits >= 1; numSuits--){
for(numCards=10;numCards >= 1; numCards--) {
generico = CRD_createCard(vetCardName[numCards-1],numCards,vetCardSuit[numNaipes-1],numSuits);
lst = CRD_insertCard(lst,generico,CardEnum);
CardEnum++;
}
}
b = lst;
CRD_showDeck(b);
return BAR_CondRetOK;
}
如果变量名称有任何不一致,我深表歉意,我很快从葡萄牙语翻译成英语,以便让大家更好地理解。当我调用函数 CRD_showDeck(b) 时,它会正确显示一副牌中的所有牌。但是,我的主要功能认为 b 是空的。为什么会这样?
一个static
变量将变量的作用域限制在文件中。因此,在头文件中将变量声明为 static
最终会在包含头文件的每个源文件中创建不同的变量。每一个的范围都限于该源文件。因此,更改一个翻译单元中的变量值不会影响在每个其他翻译单元中创建的副本。
一个真正的全局变量(每个翻译单元都可以看到)应该在头文件中声明 extern
,并且应该恰好在一个源文件中定义。鉴于您的源文件的名称,我可能会选择添加行:
Card* b;
在Card.c
中,将头文件中的static
改为extern
我正在构建一个基本的纸牌游戏,为此我必须创建一副纸牌(虽然不是一副普通的纸牌)并洗牌。它在 Visual Studio (Windows 10) 上工作得很好,但是一旦我切换到 Xcode (Mac OS X 10.11.16),我就不能似乎得到相同的结果。
这是我的 main.c,引用了我的 .h 文件:
#include "Card.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
Card* lst = NULL;
if(CRD_createDeck(lst) != CRD_retCondOK)
printf("Something is wrong\n");
CRD_showDeck(b);
if(b == NULL)
printf("Empty\n");
return 0;
}
我的 Card.h 文件定义了 Card* b:
static Card* b;
还有我的 Card.c 文件:
#include "Card.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
CRD_tpRetCond CRD_createDeck(Card* lst){
int numCards, numSuits, CardEnum = 1;
char vetCardName[10] = {'4', '5', '6', '7', 'Q', 'J', 'K', 'A', '2', '3'};
char vetCardSuit[4][8] = {"Ouros", "Espadas", "Copas", "Paus"};
/*
lst = CRD_createList();
if(lst != NULL)
return CRD_retCondCreateError;*/
CardInfo* generico;
for(numSuits = 4; numSuits >= 1; numSuits--){
for(numCards=10;numCards >= 1; numCards--) {
generico = CRD_createCard(vetCardName[numCards-1],numCards,vetCardSuit[numNaipes-1],numSuits);
lst = CRD_insertCard(lst,generico,CardEnum);
CardEnum++;
}
}
b = lst;
CRD_showDeck(b);
return BAR_CondRetOK;
}
如果变量名称有任何不一致,我深表歉意,我很快从葡萄牙语翻译成英语,以便让大家更好地理解。当我调用函数 CRD_showDeck(b) 时,它会正确显示一副牌中的所有牌。但是,我的主要功能认为 b 是空的。为什么会这样?
一个static
变量将变量的作用域限制在文件中。因此,在头文件中将变量声明为 static
最终会在包含头文件的每个源文件中创建不同的变量。每一个的范围都限于该源文件。因此,更改一个翻译单元中的变量值不会影响在每个其他翻译单元中创建的副本。
一个真正的全局变量(每个翻译单元都可以看到)应该在头文件中声明 extern
,并且应该恰好在一个源文件中定义。鉴于您的源文件的名称,我可能会选择添加行:
Card* b;
在Card.c
中,将头文件中的static
改为extern