随笔

1、itoa

inline char *itoa(int n, char *s)
{
    char *sa=s, *p=s+1, t;
    n>0 ? p--,n=-n : (*s++="0-"[n<0]);
    n = -n;
    while (n) {
        *s++ = n%10+'0';
        n /= 10;
    }  
    *s-- = 0;
    while (p<s) {
        t = *p;
        *p++ = *s;
        *s-- = t;
    }  
    return sa;
}

 

 

2、编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符号,而未初始化的全局变量则成了弱符号。比如有这么个源文件: 


extern int errorno; 
int buf[2] = {1,2}; 
int *p; 

int main() 

  return 0; 


其中main、buf是强符号,p是弱符号,而errorno则非强非弱,因为它只是个外部变量的使用声明。 

    有了强弱符号的概念,链接器(Unix平台)就会按如下规则(参考[1],p549~p550)处理与选择被多次定义的全局符号: 

规则1: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号); 

规则2: 如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么选择强符号; 

规则3: 如果一个符号在所有目标文件中都是弱符号,那么选择其中任意一个;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值