我的编译器正在优化它不应该的东西

时间:2010-12-04 14:47:37

标签: c gcc

我的编译器MPLAB C30(GCC v3.23)未编译此代码:

 if(font_info.flags & FONT_LOWERCASE_ONLY)
  ch = tolower(ch);
 if(font_info.flags & FONT_UPPERCASE_ONLY)
  ch = toupper(ch);

它不产生汇编输出(以某种方式优化它),我无法弄清楚原因。

据我所见,我已正确定义了所有内容:

#define FONT_LOWERCASE_ONLY  1
#define FONT_UPPERCASE_ONLY  2

struct FontEntry
{
 int id;
 unsigned char width, height;
 const char *name;
 const char *lookup;
 const char *data;
 int flags;
};

struct FontEntry fonts[NUM_FONTS + 1] = {
 { 0, 8, 14, "Outlined8x14", &font_lookup_outlined8x14, &font_data_outlined8x14, 0 },
 { 1, 8, 8, "Outlined8x8", &font_lookup_outlined8x8, &font_data_outlined8x8, FONT_UPPERCASE_ONLY }, 
 { 2, 8, 8, "Tiny5x5", 0, 0, 0 }, // not yet implemented
 { -1 } // ends font table
};

我正在使用的功能是:

void write_char(char ch, unsigned int x, unsigned int y, int flags, int font)
{
 int i, yy, addr_temp, row, row_temp, xshift;
 uint16_t and_mask, or_mask, level_bits;
 struct FontEntry font_info;
 char lookup;
 fetch_font_info(ch, font, &font_info, &lookup);
    // ...
}

fetch_font_info的定义:

int fetch_font_info(char ch, int font, struct FontEntry *font_info, char *lookup)
{
 // First locate the font struct.
 if(font > SIZEOF_ARRAY(fonts))
  return 0; // font does not exist, exit.
 // Load the font info; IDs are always sequential.
 *font_info = fonts[font];
 // Locate character in font lookup table. (If required.)
 if(lookup != NULL)
 {
  *lookup = font_info->lookup[ch];
  if(lookup == 0xff)
   return 0; // character doesn't exist, don't bother writing it.
 }
 return 1;
}

我做错了什么?

2 个答案:

答案 0 :(得分:2)

由于FONT_LOWERCASE_ONLY和FONT_UPPERCASE_ONLY不为0,因此font_info.flags必须始终为0(或者在低两位中没有任何1)。编译器可以很聪明地评估它们如何评估“常量”,即使你没有这样定义它们。

我看到你的字体数组在标志部分有几个0,所以我打赌你在编译时有一个硬编码引用其中一个条目。

答案 1 :(得分:0)

你是否有可能对fetch_font_info()write_char()的返回代码采取行动(很难知道,因为你发布的write_char()不是你真的编译;发生了一些编辑)?

如果你是从fetch_font_info()返回,那么问题可能会受到lookup指向的字符测试错误的影响:

if(lookup == 0xff) 

应该是

if(*lookup == 0xff)

如果查询为非空,则fetch_font_info()将始终返回0。