gpt4 book ai didi

c - 我的编译器正在优化一些不应该的东西

转载 作者:太空宇宙 更新时间:2023-11-04 03:06:29 25 4
gpt4 key购买 nike

我的编译器 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;
}

我做错了什么?

最佳答案

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

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

关于c - 我的编译器正在优化一些不应该的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com