C/C++
_浪潮之巅
天空不曾留下鸟的痕迹,但我已飞过。
展开
-
C++ 多继承和虚继承的内存布局
转自:http://www.oschina.net/translate/cpp-virtual-inheritance警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识。 在本文中,我们解释由gcc编译器实现多继承和虚继承的对象的布局。虽然在理想的C++程序中不需要知道这些编译器内部细节,但不幸的是多重继承(特别是虚拟继承)的实现方式有各种各样的不太明确的结论(尤其是,关于向下转载 2017-04-16 21:49:40 · 309 阅读 · 0 评论 -
c语言日志封装-输出文件名、函数名、行号
在后台程序运行出问题时,详尽的日志是抓错不可缺少的帮手,这里提供一个能自动记录日志触发点文件名、行号、函数名的方法,关键是利用C99新增的预处理标识符__VA_ARGS__先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息。ANSI C标准中有几个标准预定义宏(也是常用的):__LINE__:在转载 2017-09-25 15:04:44 · 2371 阅读 · 0 评论 -
关于snprintf函数
最近项目中需要频繁用到这个函数,了解了一下其中的细节。测试代码如下:#include #include void main(){ char *str1 = "aaabbb"; char *str2 = "aaabbbcccdddeee"; char arr[10]; int res = snprintf(arr, 1原创 2017-08-31 16:23:42 · 435 阅读 · 0 评论 -
NDEBUG 、DEBUG宏 和assert() 的用法
一、NDEBUG 和 DEBUG宏的用法 1、NDEBUG宏是Standard C中定义的宏,专门用来控制assert()的行为。如果定义了这个宏,则assert不会起作用。#ifdef NDEBUG#define assert(x) ((void)0)#else...2、C Standard中规定了assert以宏来实现。被设计来可以被多次包含,其转载 2017-07-26 11:29:41 · 22723 阅读 · 0 评论 -
C语言 static和extern关键字 对变量的作用
上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问;extern用来定义和声明一个外部函数,允许其他文件访问。static和extern对变量也有作用,不过跟函数有点差别。 C语言和Java都有全局变量的概念,但是它们的用法还是有些差别的。一、在Java中,全局变量的定义没有严格的位置规定全局变量可以定义在类的最前面,也转载 2017-08-16 17:01:46 · 364 阅读 · 0 评论 -
C语言 static和extern关键字 对函数的作用
上一讲中大致介绍了变量的类型,不同类型的变量有不同的存储类型、不同的生命周期、不同的作用域。这讲介绍2个比较重要的关键字:static和extern。static和extern不仅可以用在变量上,还可以用在函数上。这讲先介绍它们对函数的作用。一、extern与函数在第三讲和第四讲中,我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件转载 2017-08-16 16:49:32 · 1021 阅读 · 0 评论 -
C++11中的匿名函数(lambda函数,lambda表达式)
这篇文章是根据维基百科整理来的,原文请看:http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B C++11提供了对匿名函数的支持,称为Lambda函数(也叫Lambda表达式). Lambda表达式具体形式如下: [capture](parameters)->return-type{body} 如果没有参数,空的圆转载 2017-06-14 14:11:37 · 303 阅读 · 0 评论 -
C++11 并发指南六( <atomic> 类型详解二 std::atomic )
C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍) 一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag 过于简单,只提供了 test_and_set 和 clear 两个 API,不能满足其他需求(如 store, load, exchange, compare_exchange 等),因转载 2017-06-09 16:00:08 · 536 阅读 · 0 评论 -
C语言常见命名规范
1 常见命名规则比较著名的命名规则首推匈牙利命名法,这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。例如:lpszSt转载 2017-04-25 14:17:41 · 2458 阅读 · 1 评论 -
c++ 原子操作
所谓的原子操作,取的就是“原子是最小的、不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源。也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问。这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高。在以往的C++标准中并没有对原子操作进行规定,我们往往是使用汇编语言,或者是借助第三方的线程转载 2017-05-03 16:57:56 · 1603 阅读 · 0 评论 -
问题解决:printf()函数无法打印
今天写聊天室项目,调试出了问题,查看了代码无法找到问题,于是用printf()逐行打印。问题定位很快,然而发现打印到一半,就无法显示。进过排查,这不是程序的问题,而是printf()函数无法打印。这个问题涉及到printf()输出缓冲的问题。对于标准输出设备stdout,输出一般都有缓冲,当遇到刷新标志或缓冲满时才把缓冲的数据输出到标准输出设备中。对于printf()函数,其使转载 2017-12-05 11:29:06 · 7200 阅读 · 0 评论