首页 > 代码库 > 编程--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有待总结