switch语句中的静态变量

时间:2014-07-21 12:21:32

标签: c++ embedded keil

我正在使用c进行keil项目。在我的一个文件中,我将顶部的一些变量定义为静态。我在这个文件中的一些函数中使用它们,我也在switch / case语句中使用它们。例如:

在顶部定义变量:

static uint8_t* imageData = 0;
static uint32_t height = 0;
static uint32_t width = 0;
static uint32_t stride = 0;

在代码中间:

switch (pMsg->MsgId)
{

case WM_CREATE:
{     
    CAMERA_Init();   
    AMProcessor *processor = new AMProcessor();

    struct block blocks[2] = {
                                 {2, 240, 160},
                                 {2, 160, 120}                              
                            };
    processor->initBlocks(blocks, 2);           
    stride = 480; //sample_image.width;                                 
    processor->Initialize(480, 272, 480, InputTypes::CHROMA_MOBILE, InputTypes::RGB); 
    BSP_LED_Toggle(LED3);

    while(1){                               
        const PictureOutput* picOut = processor->ProcessImage((uint8_t *)CAMERA_FRAME_BUFFER);                              
        break;
    }
}

在底部附近我有几个也使用这些变量的函数。 但是,我收到的警告告诉我,顶部定义的4个变量已初始化但从未引用过。如果它们不是静态的,那么我没有得到这个警告,但是我得到了一个很难的错误(我试图摆脱它)。

所以我的问题是,为什么这些没被引用?它显然与静态定义有关,但是为什么静态定义不允许引用它们?

澄清:我收到了所有这些信息,甚至是大步。 警告:#177-D:变量“imageData”已声明,但从未引用

我在底部有一个使用所有这些变量的函数:

bool ReadImageFromPgmFile(const char* pFileName, uint32_t &height, uint32_t &width, uint8_t*& ImgData) {
    if (pFileName == 0) {
            return false;
    };

    // read data from file
    if (strstr(pFileName, ".pgm") || strstr(pFileName, ".PGM")) {
            FILE *pPgmFile = fopen(pFileName, "r");

            if (pPgmFile == NULL) {
                    fprintf(stderr, "Cannot open PGM file '%s'.\n", pFileName);
                    return false;
            };

            char x = fgetc(pPgmFile);
            char y = fgetc(pPgmFile);

            if (x != 'P' || y != '5') {
                    fprintf(stderr, "Invalid PGM file '%s'.\n", pFileName);
                    return false;
            };

            uint32_t maxvalue;
            fscanf(pPgmFile, "%d", &width);
            fscanf(pPgmFile, "%d", &height);
            fscanf(pPgmFile, "%d", &maxvalue);

            if (maxvalue > 255) {
                    fprintf(stderr, "File '%s' has incorrect format.\nOnly 8-bit PGMs are supported by this reader.\n", pFileName);
                    return false;
            };

            ImgData = new uint8_t[width*height];
            memset(ImgData, 0, width*height);
            fgetc(pPgmFile);                // skip new line character
            uint32_t nPixelsRead = fread(ImgData, 1, width * height, pPgmFile);
            fclose(pPgmFile);

            if (nPixelsRead != width * height) {
                    fprintf(stderr, "PGM file '%s' does not contain all pixels.\n", pFileName);
                    return false;
            };

            return true;
    }

    return false;
};

1 个答案:

答案 0 :(得分:1)

方法声明隐藏了静态heightwidth变量。

bool ReadImageFromPgmFile(const char* pFileName, 
    uint32_t &height, 
    uint32_t &width, 
    uint8_t*& ImgData) {

在此方法中使用heightwidth将引用本地参数而不是静态变量。虽然使用了imageData参数,但我看不到对ImgData的任何引用。

此上下文中的static关键字表示变量仅对其声明的编译单元可见。删除static关键字使其成为全局变量;可通过整个计划访问。编译器无法(或不愿意)推断全局变量的使用,因此您不会收到警告。