我正在使用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;
};
答案 0 :(得分:1)
方法声明隐藏了静态height
和width
变量。
bool ReadImageFromPgmFile(const char* pFileName,
uint32_t &height,
uint32_t &width,
uint8_t*& ImgData) {
在此方法中使用height
和width
将引用本地参数而不是静态变量。虽然使用了imageData
参数,但我看不到对ImgData
的任何引用。
此上下文中的static
关键字表示变量仅对其声明的编译单元可见。删除static关键字使其成为全局变量;可通过整个计划访问。编译器无法(或不愿意)推断全局变量的使用,因此您不会收到警告。