首页 > 代码库 > 编程--const有待总结
编程--const有待总结
一、gcc
1.gcc #include的路径:/usr/include
2.gcc动态链接库:
3.生成动态链接库:-shared -fpic -o 链接库名,shared表示生成的文件为动态链接库
4.编译程序时链接动态库:-L ‘链接库路径‘ -l‘链接库名’(linux的动态库名以lib开头,以.so为后缀,故参数中的链接库名时去除lib和.so的部分,即自定义的库文件名)
5.执行程序时加载动态连接库默认路径:/usr/lib(可通过ldconfig进行配置)。
6static:
1)存储:static变量被存储在进程虚拟地址空间的数据段,所以只有在进程结束释放资源时才会消失。
2)作用域:
定义函数中,具有函数作用域,只有在调用函数时才能使用。结合存储,函数退出后变量依然存在,下次调用时可继续使用。可实现在单独的函数中使用变量<-->全局变量,可以被任何函数所使用
定义在文件中,不管是函数还是变量,都具有文件作用域,只能在该文件中使用,可屏蔽其他文件对其修改。
7.const: const修饰其后的变量,由编译器限定不允许被修改
形式:const type m 或 type const m(更直观),限定m不可变。const只修饰其后的变量,至于const放在类型前还是类型后并没有区别->替换基本形式中的m为*p1,替换后const char *p1 或 char const *p,限定*p1不可变,当然p1是可变的。故声明一个const指针,type * const p,p变量的值不能修改。或者 char *const p,指针变量p的值不能改变。
1)与常量区别:常量是被编译器放在内存中的只读区域(当然也就不能够去修改它)。const修饰的变量是在内存中开辟一个地方来存放它的值,依然是变量,只不过这个值由编译器限定不允许被修改。
2)存储位置:
text addr:80483c4
i(nitial) const global:8048534,const global:80497c0,i global:80497ac,global:80497bc,static:80497b0,const static:80497b4,i static:804979c,i const static:8048538
local: const static:80497b8,const:bfbc594c, normal:bfbc5948
常量:804853c
istaticconstlocal:8048634,staticconstlocal:8049814
tips:
代码段中存放:全局常量(const)、字符串常量、函数以及编译时可决定的某些东西
数据段(初始化)中存放:初始化的全局变量、初始化的静态变量(全局的和局部的)
数据段(未初始化)(BSS)中存放:未初始化的全局变量、未初始化的静态变量(全局的和局部的)
堆中存放:动态分配的区域(malloc、new等)
栈中存放:局部变量(初始化以及未初始化的,但不包含静态变量)、局部常量(const)
3)利用指针修改:
由于const是被编译器设定为不可改变的变量,故用非const指针指向const变量时会警告。
初始化的const全局变量(包括静态变量)被当作常量放在text端,在用指针修改时,编译阶段警告,运行时段错位(修改了text段的read only数据)。
初始化的const修饰的静态局部变量被也被当作常量放在text端,在用指针修改时,编译阶段警告,运行时段错位(修改了text段的read only数据)。
未初始化的const全局变量(包括静态变量)同未初始化的非const全局(静态)变量一起放在数据段,在用指针修改时,编译阶段警告,但是可以被修改。
未初始化的const修饰的静态局部变量放在数据段,在用指针修改时,编译阶段警告,但是可以被修改。
const修饰的局部变量被放在栈区,在用指针修改时,编译阶段警告,但是可以被修改。
8.volatile:
参考:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html
http://blog.chinaunix.net/uid-25572546-id-2191599.html
二、php:
1.在shell下运行,检查语法错误
2.phpize:添加php扩展,加入动态链接库
3.session、cookie机制:
客户端发送php请求,该php交由服务器的php-fpm解析处理,遇到php中的session_start(),服务器会在本地建立 ‘sess_id‘ 文件记录$_SESSION数组中的内容,同时,在返回给HTTP应答包的header中set_cookie字段会包含刚刚建立的sess_id文件的id(完整的为PHPSESSID=id)。浏览器收到后会在本地建立cookie文件记录该字段的内容。以后浏览器对该域名的HTTP请求的header的cookie字段都会带有该id,以便服务器识别不同的用户,找到对应的sess_id文件获取其中的内容作为$_SESSION数组。若请求的php中包含session_start()以及对$_SESSION数组的操作,都会记录在对应的sess_id文件中。
4.php操作文件出错-failed to open stream: Permission denied:
php服务器没有修改文件的权限
修改路径权限为757
5.php+mysql乱码
编码标准:GBK(双字节编码),UTF8(三字节编码)
urlencode()将字符串以URL编码,遇到非ascii,根据编码标准,码转换为"%"+"对应编码标准转换为的16进制数"
php+mysql出现乱码时要:
1.检查php页面的编码标准为utf8(以html为例): <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
2.检查从页面获取的(utf8)数据以utf8的编码格式对mysql操作(以php mysql为例): $link_id->query("set names ‘utf8‘");
3.检查mysql表的数据编码为utf8(以phpmyadmin为例): "整理"->"utf8_bin"
参考:http://www.pythonclub.org/python-basic/encode-detail
三、python
1.httplib 抛出异常
在用PC ssh 树莓派,执行python程序
源代码
try: lg.debug("connecting to server") conn = httplib.HTTPConnection(‘121.xxx.xx.140:80‘) lg.debug("sending request to server") conn.request(‘POST‘, url=‘/xxx/xx/xxxxx/xxxx/01‘, body=fzb_json, headers={‘userkey‘:config.user_key}) resp = conn.getresponse() lg.info(‘server returns: %s, %s, %s‘ % (resp.status, resp.reason, resp.read())) except Exception as e: print ‘catch Exception while requsting HTTP‘ print e finally: lg.debug("closing connection") conn.close()
出错: server returns: 404, Not Found
请求的资源不存在,可能是服务器修改了网址,故修改网址为另一个(该域名的ip与之前的ip不同)
conn = httplib.HTTPConnection(‘www.xxxx.com:80‘)
运行程序后,等了很久显示错误:
catch exception while requesting HTTP
[ERROR -2] Name or Servie not know
想到有可能是域名解析太慢或出错。ping了下baidu仍然很慢。修改/etc/hosts,加入ip和hostname,再次运行程序,成功
四、协议的制定:
协议的制定:
1.逻辑最多两层,多用if,少用else,让不懂编程的人一眼就能看懂其中的逻辑。
2.返回的一般格式:res=*&desc=*
五、动态链接库:
http://www.360doc.com/content/13/0822/20/7377734_309187677.shtml
六、Linux socket:
套接字关闭时,TCP会发送FIN通知对端。但进程终止时,系统回收资源,会关闭该进程打开的文件,故也会向对端发送FIN。
文件描述符表:每个进程在PCB(Process Control Block)即进程控制块中都保存着一份文件描述符表,文件描述表中每个表项都有一个指向已打开文件的指针;已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体(当进程打开一个文件时,内核就会创建一个新的file对象;当close(fd)
时会将引用计数减1,如果引用计数为0就会释放file
结构体,关闭文件)。 文件描述符就是文件描述符表的索引,索引到某一个表项,通过指针指向file结构体,实现对文件的操作。
参考:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html
七、函数指针
C在编译时,每一个函数都有一个入口地址,由函数名保存,跳转到该地址后执行函数体。函数指针是指向函数入口地址的指针变量,将函数名赋给函数指针,通过函数指针就可以调用该函数。与数组指针类似,数组名保存数组的地址。将数组名赋给指针,通过指针就可以访问数组元素。
编程--const有待总结