[C/C++]
xgbing
专注于嵌入式方向的软硬件设计与开发(ASM\C\C++,RTOS,Linux,android,以太网\嵌入式网络协议栈,蓝牙,WIFI,文件系统/嵌入式存储,显示\音频,单片机\DSP\ARM\Cortex,电路设计\PCB布板\硬件驱动\数字逻辑CPLD,FPGA\niosII),目前从事VirtualBox\qemu\KVM虚拟化研究工作。
展开
-
传递可变参数
(1)#define Print(...) printf(__VA_ARGS__)(2)#include <stdio.h>#include <stdarg.h>#include <ctype.h>static void __cdecl odprintf(const char *format, ...){char ...原创 2019-02-21 15:26:03 · 1244 阅读 · 0 评论 -
函数指针,返回类型为函数指针
void (*signal (int signum, void (*handler))(int))(int);等价于:typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighand原创 2011-09-13 15:13:21 · 975 阅读 · 0 评论 -
弱符号与强符号
3.5.5 弱符号与强符号2009-04-22 12:52 俞甲子/石凡/潘爱民 人民邮电出版社 《程序员的自我修养:链接、装载与库》第3章目标文件里有什么。本章介绍COFF目标文件格式和源代码编译后如何在目标文件中存储。本节为大家介绍弱符号与强符号。AD: 3.5.5 弱符号与强符号我们经常在编程中碰到一种情况叫符号重复定义。多个目标转载 2011-06-27 09:25:00 · 2029 阅读 · 0 评论 -
GCC中运用枚举定义数组的实例
enum uaddr { MTD_UADDR_NOT_SUPPORTED = 0, /* data width not supported */ MTD_UADDR_0x0555_0x02AA, MTD_UADDR_0x0555_0x0AAA, MTD_UADDR_0x5555_0x2AAA, MTD_UADDR_0x0AAA_0x0555, MTD_UADDR_DONT_原创 2011-06-24 09:57:00 · 1787 阅读 · 0 评论 -
宏连接
#define NUM 12#define STR_NUM(n) INT##nusing namespace std;int main(){ cout return(0);} 编译结果输出:(A) INT12未定义;(B) INTNUM未定义。 答案是B。原创 2011-06-14 18:12:00 · 756 阅读 · 0 评论 -
__VA_ARGS__
<br />#define TRACE(...) printf(__VA_ARGS__)<br /> <br />CCS3.3竟然不支持__VA_ARGS__,没法,换成<br /> <br />#define TRACE(x) { printf x; }<br /> <br />调用的时候使用TRACE((...));原创 2010-09-15 12:30:00 · 1279 阅读 · 0 评论 -
一段代码
<br />#include <iostream><br /><br />// Typelist<br />template <typename T, typename U><br />struct Typelist<br />{<br /> typedef T Head;<br /> typedef U Tail;<br />}; <br />// 哨卫类型<br />class NullType {};<br /> <br />// 计算长度<br />// 主模板<br />templat原创 2010-08-04 09:29:00 · 796 阅读 · 0 评论 -
大小端数据转换
#define NET_USHORT(u16) ((unsigned short)((((unsigned short)(u16)) >> 8) | (((unsigned short)(u16)) #define NET_ULONG(u32) ((unsigned long)(NET_SHORT((u32) >> 16) | (NET_SHORT(u32 & 0xFFFF) #define NET_SHORT(i16) ((short)NET_USHORT(i16))#define NET_L原创 2010-08-04 12:29:00 · 2749 阅读 · 0 评论 -
什么是yacc?
yacc(Yet Another Compiler Compiler),是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。yacc本来只在Unix系统上才有,但现时已普遍移植往Windows及其他平台。yacc的输入是巴科斯范式(BNF)转载 2011-12-15 16:57:11 · 1836 阅读 · 0 评论 -
精减版printf
sstdio.c/* ---------------------------------------------------------------------------- * ATMEL Microcontroller Software Support * ------------------------------------------------------原创 2012-06-07 17:19:51 · 1016 阅读 · 0 评论 -
代码重构
重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。 也许有人会问,为什么不在项目开始时多花些时间把设计做好,而要以后花时间来重构呢?要知道一个完美得可以预见未来任何变化的设计,或一个灵活得可以容纳任何扩展的设计是不存在的。系统设计人员对即将着手的项目往往只能从大方向予以把控,而无法转载 2014-04-12 09:05:17 · 2341 阅读 · 0 评论 -
--
1. 线程句柄会线程执行完后自动释放,无须调用CloseHandle,可以使用WaitSingleObject等待线程完成,不建议使用GetThreadExitCode()(线程没有结束此函数仍然返回TRUE),具体参考MSDN。2. 构造函数不能被继承。3. find_last_not_of是查找字符串中每单个字符的出现情况,查找字符串出现用find或rfind。4. C++在保证在原创 2010-10-22 10:18:00 · 1211 阅读 · 0 评论 -
逆波兰式
逆波兰式也叫后缀表达式(将运算符写在操作数之后) 如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+ (a+b)*c-(a+b)/e的后缀表达式为: (a+b)*c-(a+b)/e →((a+b)*c)((a+b)/e)- →((a+b)c*)((a+b)e/)- →(ab+c*)(ab+e/)- →ab+c*ab+e/- 将一个普通的中序表达式转换为逆波兰表达式的一般算法是:1)首转载 2008-09-08 10:27:00 · 2393 阅读 · 0 评论 -
BANK_BASE(i)的理解
typedef unsigned long phys_addr_t;#define CONFIG_SYS_MAX_FLASH_BANKS 1# define CFI_MAX_FLASH_BANKS CONFIG_SYS_MAX_FLASH_BANKS#define CONFIG_SYS_FLASH_BASE 0x10000000#define CONFIG_SY原创 2011-07-30 16:46:12 · 2996 阅读 · 7 评论 -
浮点数到整数的转换
在计算机图形运算中,常常要将浮点数转换为整数,例如在图像的光栅化阶段,就要执行大量的类型转换,以便将浮点数表示的坐标转化为整数表示的屏幕坐标。Ok,it's so easy:----------------------------------------------------------------------------------------//// 强制类型转换// 小数部转载 2013-05-27 11:32:42 · 32623 阅读 · 1 评论 -
VC调用matlab7.10的接口程序实例
VC调用matlab的接口方法有5 种:一、通过Matlab Engine方式 Matlab Engine是指一组Matlab提供的接口函数,支持C语言, Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受原创 2013-05-06 10:31:32 · 1640 阅读 · 0 评论 -
类成员函数指针
在一个类中如果要使用一个函数类型如回调函数,常见的做法是定义一个静态函数类型来匹配函数指针类型。定义静态函数的方法有时会偏离OO思想,影响类结构层次的设计。这里介绍一种方法,它使函数指针可能存在于对象之中。#includeusing namespace std;class test{public: test(int sel) { mf = sel?(&test::f1):(&t原创 2011-08-17 09:13:12 · 909 阅读 · 0 评论 -
堆和栈的区别(转过无数次的文章)
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两转载 2012-06-20 16:00:08 · 1008 阅读 · 0 评论 -
C++异常处理机制核心观点总结
C++异常处理机制核心观点: 0.如果使用普通的处理方式:ASSERT,return等已经 足够简洁明了,请不要使用异常处理机制. 1.比C的setjump,longjump优秀. 2.可以处理任意类型的异常. 你可以人为地抛出任何类型的对象作为异常. throw 100; throw "hello"; ... 3.需要一定的开销,频繁执行的关键代码转载 2008-12-01 12:37:00 · 1268 阅读 · 0 评论 -
结构体对齐的具体含义(#pragma pack)
结构体对齐的具体含义(#pragma pack)作者:panic2005年4月2日还是来自csdn的帖子:主 题: 探讨:内存对齐作 者: typedef_chen ((名未定)(我要骗人))等 级: 信 誉 值: 100所属论坛: C/C++ C++ 语言问题点数: 50回复次数: 1发表时间: 2005-转载 2008-07-07 15:32:00 · 1051 阅读 · 0 评论 -
指定GCC的默认头文件路径
在交叉编译的时候我们需要用到其他的库,在config时候可以通过“-I”来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法。看下文的红色部分。有大量的环境变量可供设置以影响 GCC 编译程序的方式。利用这些变量的控制也可使用合适的命令行选项。一些环境变量设置在目录名列表中。这些名字和 PATH 环境变量使用的格式相同。特殊字符 PATH_SEPARATOR (安装编译程序的时转载 2008-09-11 11:25:00 · 1395 阅读 · 0 评论 -
C语言宏定义技巧(常用宏定义)
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 1,防止一个头文件被重复包含#ifndef COMDEF_H#define COMDEF_H //头文件内容#endif2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。typedef转载 2008-02-19 10:26:00 · 1440 阅读 · 1 评论 -
继承访问权限的一些资料总结1
C++类继承关系中访问控制之变化 bauldeng 4/1/2006 根据C++语法规则,以及在MS VC++6.0中的例子试验,可以得出如下结论。 1. B从A public继承 A之public区=>B之public区; A之protected区=>B之protected区; A之private区对B不可见; 2. B从A private继承 A之public区=>B之private区; A之转载 2008-02-19 10:22:00 · 1138 阅读 · 0 评论 -
sizeof
解析C语言中的sizeof 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型转载 2008-02-19 10:30:00 · 1095 阅读 · 0 评论 -
讨论:C程序怎样组织更有结构性
由于自己在一家公司写着代码,项目比较小,没有机会接触大的项目,很多东西都体会不到,开了一个贴子在C版块长期讨论C语言,希望能从前辈们学习到更多的 知识。贴子地址:http://community.csdn.net/Expert/topic/5661/5661141.xml?temp=.3375666原创 2007-07-24 08:23:00 · 1324 阅读 · 0 评论 -
小心指针间的赋值
int *p=NULL; int *q=p; p=new int[1]; *p=100; cout cout//p重新分配内存后,p,q不等了//使用realloc也可能由于内存块移动引起类似问题原创 2007-07-16 15:12:00 · 1115 阅读 · 1 评论 -
malloc,calloc,realloc
malloc分配N个大小内存calloc分配N个大小内存置0,p=calloc(m,n)类似 p = malloc(m * n); memset(p, 0, m * n);realloc重新分配内存,小心使用它,重新分配内存时内存块可能被移动#include char *p,*q;p = (char * ) malloc (10);q=p;p = (char原创 2007-07-16 15:03:00 · 1220 阅读 · 1 评论 -
通过COM技术实现Windows外壳编程
摘要:本文介绍了一种有别于通常的Windows外壳编程方法。采用COM技术,通过Windows提供的外壳接口实现对其的编程。 一、 引言 在Windows环境下,不论是使用Visual C++还是Delphi或是其他一些软件开发工具,尽管存在着差别,但有一点是相同的:都是运行于Windows操作系统之下的。在程序开发过程中也经常要在自己的应用程序中加入一些Windows系统本身就有的功能,比如转载 2006-09-18 09:19:00 · 2618 阅读 · 0 评论 -
函数调用过程
C代码:int fun(int para){ int a=0; return 0;}void main(){ fun(1);}汇编代码:1:2:3: int fun(int para)4: {0040B810 push ebp ;保护寄存器ebp0040B811 m原创 2006-03-08 10:13:00 · 8446 阅读 · 1 评论 -
C语言模块化
在C语言的应用领域,如通讯领域和嵌入式系统领域,一个的软件项目通常包含很多复杂的功能,实现这个项目不是一个程序员单枪匹马可以胜任的,往往需要一个团队的有效合作,另外,在一个以C代码为主的完整的项目中,经常也需要加入一些其他语言的代码,例如,C代码和汇编代码的混合使用,C文件和C++的同时使用。这些都增加了一个软件项目的复杂程度,为了提高软件质量,合理组织的各种代码和文件是非常重要的。转载 2008-02-19 10:25:00 · 6634 阅读 · 3 评论 -
struct和class区别的背后
讨论一下结构(struct)与类(class)的区别,你认为结构(struct)有些什么作用,可以完全用类(class)取代么??---------------------------------------------------------------首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的。毕竟不同的人偏好不同。从语法上,在C转载 2008-02-19 10:23:00 · 1396 阅读 · 0 评论 -
GCC编译选项
在BSD爱好者上看到的 感觉挺好的 所以转来了作者是:剑心通明 1. -c 编译产生对象文件(*.obj)而不链接成可执行文件,当编译几个独立的模块,而待以后由链接程序把它们链接在一起时,就可以使用这个选项,如:$cc -c hello.c ===> hello.o$cc hello.o2. -o 允许用户指定输出文件名,如$cc hello.c -o hello.oor$cc hello.c -转载 2008-09-11 14:07:00 · 1260 阅读 · 0 评论 -
Makefile教程
概述——什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefil转载 2008-09-09 20:11:00 · 1107 阅读 · 0 评论 -
初识C语言中的opaque类型
在移植yaffs2到VxWorks的过程中发现direct/yaffsfs.h中有这么一行代码:typedef struct __opaque yaffs_DIR;而该头文件中并没有任何关于struct __opaque的定义,搜寻了一下系统里的其他头文件,也没有找到。google了一下才找到一篇介绍这种用法的文章Programming Tools - Opaque Pointers。转载 2008-08-06 11:24:00 · 10232 阅读 · 0 评论 -
状态机
有限状态机(Finite State Machine或者Finite State Automata)是软件领域中一种重要的工具,很多东西的模型实际上就是有限状态机。最近看了一些游戏编程AI的材料,感觉游戏中的AI,第一要说的就是有限状态机来实现精灵的AI,然后才是A*寻路,其他学术界讨论比较多的神经网络、模糊控制等问题还不是很热。FSM的实现方式:1) switch/case或者if/else这无转载 2008-08-07 19:58:00 · 38470 阅读 · 9 评论 -
VC中插入汇编
int _tmain(int argc, _TCHAR* argv[]){ int a,b, c; __asm { mov a, 1 mov b, 2 } __asm mov c, 3; cout<< a << b << c; system("pause"); return 0;}_asm 同 __asm等效,它是为了兼容以前版本。原创 2008-07-11 09:37:00 · 1202 阅读 · 0 评论 -
32位CPU寄存器和汇编指令
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS)1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。转载 2008-07-11 09:34:00 · 4993 阅读 · 2 评论 -
C++文件操作
在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:1、插入器( 向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout2、析取器(>>) 从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入转载 2008-04-29 11:01:00 · 1510 阅读 · 0 评论 -
C89和C99标准比较
C89和C99标准比较 原文转载自: http://blog.programfan.com/article.asp?id=14051 注: GCC支持C99, 通过 --std=c99 命令行参数开启,如: 代码:gcc --std=c99 test.c --------------------------------------------------------------------转载 2008-04-29 11:02:00 · 8591 阅读 · 0 评论 -
参数传递之指针传递
(1)基础知识C课本上的一个程序:void swap(int *p1,int *p2){ int t=*p1; *p1=*p2; *p2=t;}void main(){ int a=1,b=2; swap(&a,&b); ...}a,b的值交换了是因为a,b的地址被传递给了函数swap,使得p1=&a,p2=&b。为了看得更清楚些,更改一些:void swap(原创 2006-03-20 18:24:00 · 21057 阅读 · 1 评论