Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2108395
  • 博文数量: 413
  • 博客积分: 10926
  • 博客等级: 上将
  • 技术积分: 3862
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-09 18:14
文章分类

全部博文(413)

文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(6)

2011年(138)

2010年(85)

2009年(42)

2008年(46)

2007年(26)

2006年(59)

分类: C/C++

2006-11-07 13:24:04

The C Preprocessor:
http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/index.html#Top

1, 宏
    __FILE__
    __LINE__
    __func__
    __FUNCTION__  同__func__
    __PRETTY_FUNCTION__  这个宏比__FUNCTION__功能更强,  若用g++编译C++程序, __FUNCTION__只能输出类的成员名,不会输出类名; 而__PRETTY_FUNCTION__则会以   ::() 的格式输出成员函数的详悉信息(注: 只会输出parameters-list的形参类型, 而不会输出形参名).若用gcc编译C程序,__PRETTY_FUNCTION__跟__FUNCTION__的功能相同.
    __DATE__
    __TIME__ 

2, printf函数
    %d    %u     int,        unsigned int
    %ld   %lu    long,       unsigned long
    %lld  %llu   long long,  unsigned long long

3, 关于long long数据类型
   #define NUM1 100ll
   #define NUM2 100ull
   #define NUM3 100llu

   long long num1 = NUM;
   unsigned long long num2 = NUM2;
   unsigned long long num3 = NUM3;


4, 求x的2进制数中含1的个数。

int func(x)
{
    int countx = 0;
    while(x)
    {
        countx ++;
        x = x&(x-1);
    }
    return countx;
}


5, ({statement1;...;statementn;})

执行{}内的statements,并返回statementn的结果.
eg:
   int i = ({int j, k, l; j = 2; k = 3; l = j + k;});
   执行后,i的值为5


6, 获得变量的类型
C:   __typeof__
C++: typeof
e.g.
int i;
__typeof__(i) j = i;

int i;
typeof(i) j = i;


7, gcc 常用选项

7.1 -fomit-frame-pointer 编译生成的代码不要栈框架。即进函数的
     push ebp 
     mov ebp, esp
退出函数的
     mov esp, ebp
     pop ebp

7.2 -mpreperred-stack-boundary=n 希望栈按照2的n次方的字节边界对齐,默认为16字节对齐
7.3 -static 告诉连接器不连接任何共享库。
7.4 -rpath directory 加一个目录到运行时library的搜索路径。所有的-rpath参数被连接
    在一起然后传给动态连接器。它们被用来在运行时定位共享库。
7.5 -Bdynamic 和 -Bstatic
默认情况下,假如共享库可用,连接器会使用共享库。但是-Bdynamic和-Bstatic提供了很好控制库的方法。它们可以决定用共享库还是用静态库。

传-Bdynamic和-Bstatic选项给连接器,如下操作:
# gcc -o main main.o -Wl,-Bstatic -lfoo -Wl,-Bdynamic -lbar
foo是静态库, bar是共享库

# gcc -o main main.o -Wl,-Bstatic
告诉连接器所有的库(象libc等等)都使用静态的版本。

7.6 -Wl,-zdefs
编译动态库时,自动搜索所需要的库,若库不存在或不匹配,则编译失败。
gcc -shared -o libtest.so test.c -lm -lXXX -Wl,-zdefs

8, 默认情况下, 应用程序栈空间是随机变化的,也就是说,同一个局部变量,它的地址在每次运行时几乎都不一样。我们可以通过执行如下命令
    echo "0" > /proc/sys/kernel/randomize_va_space
来禁止栈空间的随机变化,使局部变量的地址在每次运行时都相同。

9, 定义简易的printf
#include
#include
void myprintf(char *fmt, ...)
{
    va_list va;
    int d;
    char c, *s; 

va_start(va, fmt);
while (*fmt)
{
    switch(*fmt++)

     {

case 's':
     s = va_arg(va, char *);
     printf("string %s\n", s);
break;
case 'd':

     d = va_arg(va, int);
     printf("int %d\n", d);
    break;
case 'c':

     c = va_arg(va, char);
     printf("char %c\n", c);
    break;

}

va_end(va);
}

阅读(3824) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~