![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++基本语法
企鹅
个人github github.com/AlexStocks ,新 blog 地址 alexstocks.github.io 。
展开
-
C语言关键字const再理解
以往对C语言关键字const的理解是一个const类型的常量指针被赋值为某一块内存区域的首地址时,这块内存区域中的数据不可修改。 如代码const char* string = “abcdefg",此时常量指针string指向一块内存区域,其中数据为"abcdefg",其中的数据不可修改。 但是若遇到以下代码: char原创 2013-05-03 20:08:56 · 1289 阅读 · 0 评论 -
opensuse12.2的gdb不能自动加载.gdbinit的解决方法
个人使用gdb调试程序的时候,喜欢在当前目录下先写一个.gdbinit,直接运行一个"/home/huang/sdk> gdb"命令,就可以快速调试了。 最新的opensuse12.2的gdb版本是GNU gdb (GDB) SUSE (7.4.50.20120603-2.1.2),安装以往的老习惯,写完.gdbinit文件,来一个gdb命令,回车之后,却给我这样一个提示:war原创 2012-10-26 13:23:10 · 6683 阅读 · 0 评论 -
FlatBuffers要点
FlatBuffers发布出来一周多,周末便抽时间先研究下它的使用方法。Flatbuffers的idl的语法主要参考[http://google.github.io/flatbuffers/md__schemas.html ]。本文主要介绍几个它的monster.fbs没有给出说明的几个语法点和相关的注意事项。1 comment它的注释中介绍了”///",说明是可以生成do原创 2014-06-21 18:29:29 · 8750 阅读 · 0 评论 -
定制一个FlatBuffers编译器
个人并不喜欢FlatBuffers编译器生成的代码,原因是我已经习惯了unix风格的代码。 不喜欢之处大致有以下: 1 命名法使用了Pascal命名法,而我个人习惯了小写字母加下划线式的unix式命名法; 2 Create类的函数参数列表的所有参数都堆在一行,非常惨不忍睹,我自己习惯于每行一个参数式的风格; 3 生成的头文件连个预防文件被重复原创 2014-06-25 07:52:12 · 3689 阅读 · 0 评论 -
如何快速的把日志输出到磁盘上
不管是做客户端业务,还是做服务端业务,日志子系统都是非常重要的一个组件。 日志系统的输出目的地可以是disk,也可以是tty,更可以是network。 我的日志系统可以输出到tty,不同log level可以有不同的color,这样看日志非常的醒目,当然这里着重谈的是如何快速的把log内容写到磁盘上。 其实,如何快速的把log内容写到磁盘上,网上文章已经汗原创 2014-08-09 21:57:51 · 2420 阅读 · 1 评论 -
C++11中lock_guard和unique_lock的区别
C++11中有一个区域锁lock_guard,其原创 2014-11-10 20:20:59 · 29043 阅读 · 3 评论 -
多线程下写日志
鄙人最近遇到了一个奇特的线上事故,记录一下,以备记忆。 鄙人所在的部门负责给公司提供各种基础库,即基础架构部门。最近某别的部门用本部门提供的支持多线程版本的日志库后,出现这样一个奇特的现象:当磁盘被日志写满以后,他们的数据文件的头部被写上了最新的日志!就是说,别的部门的程序的数据文件被日志数据给污染了。 这里先不介绍这个事故的原因。先说下这个日志库的写日志过程,原创 2014-10-31 17:00:21 · 13663 阅读 · 4 评论 -
关于gc
目前成熟的工业语言java和c#都有非常成熟的垃圾回收机制。 另外一个成熟的oop语言c++和c发展到目前都没有gc机制,以前非常不解。只到最近看了go语言,才粗略地明白一些原因 。 go语言有自己的gc机制,也有指针技术,但是go语言中不允许对指针进行加减法等数学运算,即一个指针只能指向某个地址,类似于C中的type * const ptr类型的固定地址指针。 而在原创 2014-12-02 13:47:05 · 1896 阅读 · 0 评论 -
C语言运算时的参数符号自动转换
一个简单的问题?C语言中int和unsigned int二者谁的数值范围大?提示一下,数值0在int中有+0和-0之分,unsigned int中0只有一个+0,所以unsigned int的数值范围比int大。有C语言运算代码如下:#include int main(int argc, char** argv) { int val = -15; un原创 2013-01-30 09:13:58 · 1150 阅读 · 0 评论 -
C程序中函数名与宏名称同名
C语言中,函数名称和宏名称可以相同。可以参考下面的示例程序。///////////////////////////////////////////test.cpp#include void print(int value) { printf("%d\n", value);}#define print(x) printf("hello"原创 2012-12-25 17:34:19 · 9309 阅读 · 0 评论 -
const型变量与函数重载
C++中定义const型变量,可以用一个非const型变量或者const变量初始化这个const变量,但是如果不用类型强制转换则不可以用一个const变量初始化一个非const变量。另外,我的观点是const只能修饰一个变量。 上面的最后一句话,你可能有非议,我可以说明。第一,一个const不能修饰一个全局函数。第二,你可能举例说明C++的类中const可以修饰一个函数,但是你还记得每个函数中都可以用一个默认的this指针?C++编译的时候会在函数的参数列表中添加一个类的this指针(静态原创 2010-10-22 10:12:00 · 848 阅读 · 0 评论 -
编译器内部的秘密--微软的编译器是如何解析Try/Catch/Throw的
<br /><br />引言<br /><br />开始文章之前,先声明几件重要事情。本文不是一篇介绍如何在x86架构上详细地实现异常处理(exception handling)的手册,只是一篇入门的讨论性文章。本文只是讨论一些处理步骤在理论上应该如何实现,其具体的实现步骤可能跟文章所讨论的并不一致。如果你关注异常处理的细节,并实现它,这可能要花费你数年之功。<br /><br />一些程序员可能(大部分是Java程序员)并不清楚一些异常不能被catch到,可能是因为她们在函数中已经被处理了。这翻译 2011-04-02 17:56:00 · 2203 阅读 · 0 评论 -
避免使用goto语句的几种方法
<br />如果有以下顺序执行的、非顺序的代码段:<br /><br /> bool bFailed = true;<br /><br /> if(condition1_fails)<br /><br /> goto Exit;<br /><br /> ...<br /><br /> if(condition2_fails)<br /><br /> goto Exit;<br /><br /> ...<br /><br /> ...<br /><b翻译 2011-04-03 08:57:00 · 4085 阅读 · 1 评论 -
双重for循环语句块的优化
双重循环语句的书写,是有讲究的。不同的书写方式,效率会大不一样。有如下代码模块: typename tArray[20][600]; uint32 uIdxI = 0; //uint32 is short for unsigned int uint32 uIdxJ = 0; for (uIdxI = 0; uIdxI {原创 2011-06-04 06:11:00 · 11962 阅读 · 0 评论 -
不借助临时变量交换两个变量的值
如果要交换两个变量的值,一段典型的代码如下: void swap(type& a, type& b) { type temp = a; a = b; b = temp; } 如果要求不借助于临时变量,则可能有如下代原创 2011-07-24 10:49:52 · 1092 阅读 · 0 评论 -
数组是否应该初始化?
程序中的变量初次声明时,应该初始化。 如:int i = 0; 但是今天一个朋友给了如下两个测试程序,用gcc编译后,效率还是相差很多的。 下面的函数func中数组没有初始化,函数被执行1000000次,则运行3ms。 void func(原创 2011-09-10 20:24:34 · 1499 阅读 · 0 评论 -
关于宏的两个bug
个人用define定义宏的时候,有个习惯,进行宏拓展时候,习惯于把外面传进来的参数加上小括号使用。例如: #definesum(x, y)((x) + (y))如果要定义宏对结构体进行操作,以前也是使用其指针形式进行操作,所以亦无碍。如:#defineget_num(N)((N)->num)但是今天无意,使用了结构体本身,固有的六年多的习惯栽了跟头。有结构体NUM:ty原创 2012-09-17 19:47:16 · 1307 阅读 · 0 评论 -
怎样安全的使用可变参数宏__VA_ARGS__
今天遇到一个关于可变参数的问题,下面先给出一个示例程序说明我遇到的问题。0 #include 1 2 #define print(fmt, ...) out(fmt, __VA_ARGS__)3 #define out(fmt, ...) printf(fmt, __VA_ARGS__)4 5 int main(int argc, char** argv原创 2012-10-11 20:09:40 · 5610 阅读 · 0 评论 -
显示dos命令ping和tracert等输出结果中的ip对应的地域名称
公司老大今天使用了dos命令ping,他想看到其中ip地址对应的地域名称。如dos下命令ping www.qq.com的输出结果是:正在 Ping www.qq.com [113.108.20.50] 具有 32 字节的数据:正在 Ping www.qq.com [113.108.20.50] 具有 32 字节的数据:来自 113.108.20.50 的回复: 字节=32 时间原创 2012-11-26 21:24:18 · 2632 阅读 · 0 评论 -
protobuf v3测试
谷歌最近发布了v3版本的protobuf,以前的protobuf被称之为v2,二者之间的区别其特点见我上一篇blog《protobuf一些注意事项》。 个人以为v3要比v2好处就在于:简洁,且二者的新版本都共同支持了新的数据类型:map。相比v2,它去掉了required等选项,只保留了repeated选项,还添加了时间等比较常用的数据类型(当然暂时还没有实现)等等。唯一的缺点就是,v3原创 2015-02-07 16:54:55 · 18050 阅读 · 3 评论