为什么我的main.c文件没有获得此全局静态变量的更新值?

时间:2018-04-30 21:21:51

标签: c reference static static-linking

我正在建立一个基本的纸牌游戏,为此,我必须创建一副牌(不是常规纸牌)并将其洗牌。它在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是空的。为什么会这样?

1 个答案:

答案 0 :(得分:1)

static变量将变量的范围限制为文件。因此,在头文件中将变量声明为static最终会在包含标头的每个源文件中创建不同的变量。每个范围都限于该源文件。因此,在一个翻译单元中更改变量值对在每个其他翻译单元中创建的副本没有影响。

真正的全局变量(由每个翻译单元看到)应该在头文件中声明extern,并且应该在其中一个源文件中定义。鉴于源文件的名称,我可能会选择添加以下行:

Card* b;

Card.c中,并在标头文件中将static更改为extern