c misc

1. warning root cause.
warning: incompatible implicit declaration of built-in function ‘exit’
使用gcc编译程序,若碰到这样的warning:incompatible implicit declaration of built-in function ‘exit’,则表明没有include相应的头文件。
在*.h文件里,加了一行include就解决问题了: #include <stdlib.h>

warning: `sys_errlist' is deprecated; use `strerror' or `strerror_r' instead
sys_errlist[errno] -> strerror(errno)
2. sockaddr & sockaddr_in
  struct   sockaddr结构类型是用来保存socket信息的: 
  struct   sockaddr   { 
     unsigned   short   sa_family;   /*   地址族,   AF_xxx   */
       char   sa_data[14];   /*   14   字节的协议地址   */ 
    }; 

  sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。
  另外还有一种结构类型: 
  struct   sockaddr_in   { 
     short   int   sin_family;   /*   地址族   */ 
     unsigned   short   int   sin_port;   /*   端口号   */ 
     struct   in_addr   sin_addr;   /*   IP地址   */
     unsigned   char   sin_zero[8];   /*   填充0   以保持与struct   sockaddr同样大小   */ 
  }; 
  这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到与struct   sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向sockaddr_in   的指针和指向sockaddr的指针可以相互转换,这意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向sockaddr_in的指针转换为指向sockaddr的指针;或者相反。

3. c extern
    1. 用于变量,告诉编译器,这是变量声明,变量的定义在另外的模块。
    2. 对函数来说,没有意义。
    3. extern "C", 告诉C++编译器,用C链接,也就是不要mangle函数名。
    4. 要注意数组与指针不同, 数组extern int a[]; 指针用 extern int *b;
4. alias indent='indent -ts1 -bli0 -cli2'

5. gcc base.c -o base `pkg-config --cflags --libs gtk+-2.0`
      pkg-config 是通过库提供的一个 .pc 文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。这些信息可以通过 pkg-config 提供的参数单独提取出来直接供编译器和连接器使用。
      /usr/lib/pkgconfig/gtk+-2.0.pc
6.  typedef 定义普通函数
    typedef int FUN(int age, char* name);
    FUN create_student
    same with:
    int create_student(int age, char* name);
    在一些函数具有相同参数的时候可以简化函数定义.
7.  gcc -l参数和-L参数
   -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?-lname,在连接时,装载名字为“libname.a”的函数库:-lm表示连接名为“libm.a”的数学函数库。就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了
   好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)
   放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest
   -include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,如果不在源码中include, gcc -include test.h. -include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的--cflags参数就是用来生成-I参数的
   

你可能感兴趣的:(C++,c,socket,gcc,C#)