一些小知识点

来源:互联网 发布:黄连上清丸河南淘宝 编辑:程序博客网 时间:2024/05/01 10:10
1.宏定义中define x y
如果y是内容太长1行放不下,用“\”表示下一行内容是紧接上一行的,保证中间没有空行,否则不再是define的内容,而是下面的代码段了。2.__func__和__LINE____func__编译的时候,替换为这条语句所在的函数的函数名例如int main(void){printf("%s\n", __func__);return 0;} 此时会输出main__LINE__是c内置全局函数,会返回当前行所在的行号line = __LINE__ ;3.linux安装过程中其中–prefix选项就是配置安装的路径,如果不配置该选项,安装后可执行文件默认放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share,比较分散。可以配置–prefix,如:./configure –prefix=/usr/local可以把所有资源文件放在/usr/local的路径中。好处是卸载软件或移植软件。当某个安装的软件不再需要时,只须简单地删除该安装目录,就可以把软件卸载得干干净净;移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统)。4在使用多线程编程时时,使用gcc,会出现错误:undefined reference to 'pthread_create'

 主要是以下两种原因:

1、#include <pthread.h>  请确认头文件是否添加

2、改为gcc -Wall main.c -o main -lpthread

5堆和栈的区别一个由C/C++编译的程序占用的内存分为以下几个部分1)、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2)、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3)、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后由系统释放。4)、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放5)、程序代码区—存放函数体的二进制代码。例子这是一个前辈写的,非常详细 //main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() { int b; 栈 char s[] = "abc"; 栈 char *p2; 栈 char *p3 = "123456"; 123456\0在常量区,p3在栈上。 static int c =0; 全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); 分配得来得10和20字节的区域就在堆区。 strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 }

5.网络编程中的fd和fd_set

这个FD就是File Discriptor 中文翻译为文件描述符Socket起源于unix,Unix中把所有的资源都看作是文件,包括设备,比如网卡、打印机等等,所以,针对Socket通信,我们在使用网卡,网卡又处理N多链接,每个链接都需要一个对应的描述,也就是惟一的ID,即对应的文件描述符。简单点说也就是 int fd = socket(AF_INET,SOCK_STREAM, 0); 函数socket()返回的就是这个描述符。在传输中我们都要使用这个惟一的ID来确定要往哪个链接上传输数据。select()函数主要是建立在fd_set类型的基础上的。fd_set是一组文件描述字(fd)的集合,它用一位来表示一个fd(下面会仔细介绍),对于fd_set类型通过下面四个宏来操作:fd_set set;FD_ZERO(&set);       /* 将set清零使集合中不含任何fd*FD_SET(fd, &set);    /* 将fd加入set集合 */FD_CLR(fd, &set);    /* 将fd从set集合中清除 */FD_ISSET(fd, &set);  /* 测试fd是否在set集合中*/      6.makefileall: 一般代表编译所有相关项目。$@ 表示目标$< 表示第一个依赖$^ 表示所有的依赖7.gcc参数
ansi 是使用c++98标准去编译代码-O2 是打开第二级的优化
gcc的-D参数:在gcc命令中定义宏,比如如下的代码:
/* hello.c */
#include 

#ifdef YES
char* str = "Yes, this is a macro.";
#else
char* str = "No, there is no macro.";
#endif

int main()
{
    printf("%s\n", str);
    return 0;
}
使用-D传入宏YES来进行编译:
recordus@LFS test # gcc -DYES -o helloyes hello.c
recordus@LFS test # ./helloyes
Yes, this is a macro.
 
8.mongoose.c 805

strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:
char * strchr (const char *str, int c);
【参数】str 为要查找的字符串,c 为要查找的字符。
strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。

9.
整型常量有3种表示方式:①十进制整数。例如,123、一456、0。②八进制整数。以0开头的整数是八进制数。例如,0123表示8进制数123<8),等于十进制数83。③十六进制整数。以ox或0x开头的整数是十六进制数。例如,0x1.23或0Xl 23表示十六进制数123…),等于十进制数291。
10.
cntl(fd, F_SETFD, FD_CLOEXEC);// 这里设置为FD_CLOEXEC表示当程序执行exec函数时本fd将被系统自动关闭,表示不传递给exec创建的新进程, 如果设置为fcntl(fd, F_SETFD, 0);那么本fd将保持打开状态复制到exec创建的新进程中FD_CLOEXEC用来设置文件的close-on-exec状态标准。在exec()调用后,close-on-exec标志为0的情况,此文件不被关闭。非零则在exec()后被关闭。默认close-on-exec状态为0,需要通过FD_CLOEXEC设置。
11.
%n与其他格式说明符号不同。%n不向printf传递格式化信息,而是令printf把自己到该点已打出的字符总数放到相应变元指向的整形变量中。因此%n对于的变元必须是整形指针。对printf调用返回之后,%n对于变元指向的变量中将包含有一个整数值,表示出现%n时已经由该次printf调用输出的字符数。printf("this%n is a test\n",&count);//调用后count为412.SIGPIPE和SIGCHLDSIGPIPE当服务器close一个连接时,若client端接着发数据。根据TCP协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。SIGCHLD是指当一个进程正常终止或者异常终止,内核向其父进程发送SIGCHLD信号。因为子进程终止是异步事件,所以这种信号是内核像父进程的异步通知。12.
函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。malloc()函数有一个参数,即要分配的内存空间的大小:void *malloc(size_t size);calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。void *calloc(size_t numElements,size_t sizeOfElement);如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址。函数malloc()和函数calloc()的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。函数calloc()会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。
13.
assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:
#include <assert.h>void assert( int expression );
  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

14、strcspn

头文件:#inclued<string.h>

定义函数:size_t strcspn(const char *s, const char * reject);

函数说明:strcspn()从参数s 字符串的开头计算连续的字符, 而这些字符都完全不在参数reject所指的字符串中. 简单地说, 若strcspn()返回的数值为n, 则代表字符串s 开头连续有n 个字符都不含字符串reject内的字符.

返回值:返回字符串s 开头连续不含字符串reject 内的字符数目.

范例
#include <string.h>
main()
{
    char *str = "Linux was firstdeveloped for 386/486-based pcs. ";
    printf("%d\n", strcspn(str, ""));
    printf("%d\n", strcspn(str,"/-"));
    printf("%d\n", strcspn(str,"1234567890"));
}

执行结果:
5 //只计算到" "的出现, 所以返回"Linux"的长度
33 //计算到出现"/"或"-", 所以返回到"6"的长度
30 // 计算到出现数字字符为止, 所以返回"3"出现前的长度

15.

X 表示以十六进制形式输出02 表示不足两位,前面补0输出;出过两位,不影响举例:printf("%02X", 0x123);  //打印出:123printf("%02X", 0x1); //打印出:0116.strcat() 函数用来连接字符串,其原型为:char *strcat(char *dest, const char *src);【参数】dest 为目的字符串指针,src 为源字符串指针。strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。注意:dest 与 src 所指的内存空间不能重叠,且 dest 要有足够的空间来容纳要复制的字符串。【返回值】返回dest 字符串起始地址。

0 0