关于gcc中C语言的两篇文章

本文介绍了如何在GCC中使用枚举类型定义数组,并通过具体的示例代码展示了这一过程。通过对不同枚举值对应的地址进行初始化,实现了特定的解锁地址配置。

初始C语言中的opaque类型:

http://blog.youkuaiyun.com/xgbing/article/details/2775426

GCC中运用枚举定义数组的实例:

http://blog.youkuaiyun.com/xgbing/article/details/6564979

#include <stdio.h>
#include <stdlib.h>

#define u32 unsigned int

enum uaddr {  
	MTD_UADDR_NOT_SUPPORTED = 0,    /* data width not supported */  
	MTD_UADDR_0x0555_0x02AA,  
	MTD_UADDR_0x0555_0x0AAA,  
	MTD_UADDR_0x5555_0x2AAA,  
	MTD_UADDR_0x0AAA_0x0555,  
	MTD_UADDR_DONT_CARE,        /* Requires an arbitrary address */  
	MTD_UADDR_UNNECESSARY,      /* Does not require any address */  
};  
	
struct unlock_addr {  
	u32 addr1;  
	u32 addr2;  
}; 

/* 
 * I don't like the fact that the first entry in unlock_addrs[] 
 * exists, but is for MTD_UADDR_NOT_SUPPORTED - and, therefore, 
 * should not be used.  The  problem is that structures with 
 * initializers have extra fields initialized to 0.  It is _very_ 
 * desireable to have the unlock address entries for unsupported 
 * data widths automatically initialized - that means that 
 * MTD_UADDR_NOT_SUPPORTED must be 0 and the first entry here 
 * must go unused. 
 */  
static const struct unlock_addr  unlock_addrs[] = {  
    [MTD_UADDR_NOT_SUPPORTED] = {  
        .addr1 = 0xffff,  
        .addr2 = 0xffff  
    },  
  
    [MTD_UADDR_0x0555_0x02AA] = {  
        .addr1 = 0x0555,  
        .addr2 = 0x02aa  
    },  
  
    [MTD_UADDR_0x0555_0x0AAA] = {  
        .addr1 = 0x0555,  
        .addr2 = 0x0aaa  
    },  
  
    [MTD_UADDR_0x5555_0x2AAA] = {  
        .addr1 = 0x5555,  
        .addr2 = 0x2aaa  
    },  
  
    [MTD_UADDR_0x0AAA_0x0555] = {  
        .addr1 = 0x0AAA,  
        .addr2 = 0x0555  
    },  
  
    [MTD_UADDR_DONT_CARE] = {  
        .addr1 = 0x0000,      /* Doesn't matter which address */  
        .addr2 = 0x0000       /* is used - must be last entry */  
    },  
  
    [MTD_UADDR_UNNECESSARY] = {  
        .addr1 = 0x0000,  
        .addr2 = 0x0000  
    }  
};  

int main(void)
{
	printf("unlock_addrs[MTD_UADDR_0x0AAA_0x0555].addr2=0x%x\n", unlock_addrs[MTD_UADDR_0x0AAA_0x0555].addr2);
}

输出结果:


其实有些利用GCC的特性,对编译器有兴趣可以深入研究!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值