
C/C++
专注嵌入式
喜欢LINUX、嵌入式、driver、kernel,寻找志同道合的朋友
展开
-
__DATE__,__FILE__,__LINE__,__TIME__,__FUNCTION__
<br />C99 ( ISO/IEC 9899:1999 ) 网上有pdf文件。<br /><br /> C标准中指定了一些预定义的宏,对于编程经常会用到。下面这个表中就是一些常常用到的预定义宏。<br /><br />__DATE__<br /> 进行预处理的日期(“Mmm dd yyyy”形式的字符串文字)<br /><br />__FILE__<br /> 代表当前源代码文件名的字符串文字<br /><br />__LINE__<br /> 代表当前源代码中的行号的转载 2011-05-17 10:27:00 · 1267 阅读 · 0 评论 -
GNU C的__attribute__机制
From http://hi.baidu.com/cygnusnow/blog/item/8b82000f871fcf2f6159f3de.html<br />GNUC的一大特色(却不被初学者所知)就是__attribute__机制。__attribute__可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。<br />__attribute__书写特征是:__attribute__前后都有转载 2011-05-17 13:41:00 · 496 阅读 · 0 评论 -
request_mem_region粗略讲解
<br />linux下request_mem_region的粗略理解<br /><br />文章来源:http://gliethttp.cublog.cn<br /> Linux把基于I/O映射方式的I/O端口和基于内存映射方式的I/O端口资源统称为“I/O区域”(I/O Region)。I/O Region仍然是一种I/O资源,因此它仍然可以用resource结构类型来描述。<br /> Linux是以一种倒置的树形结构来管理每一类I/O资源(如:I/O转载 2011-05-19 16:43:00 · 678 阅读 · 0 评论 -
printf中#号的意思
<br />#进行宏字符串连接,在宏中把参数解释为字符串,不可以在语句中直接使用。<br />在宏定义中<br />printf("%s;/n", #S) 会被解释为<br />printf("%s;/n", "S")<br />例如下面的代码<br />code start<br />#define TRACE(S) (printf("%s;/n", #S), S) /*注意用逗号而不是分号*/<br /><br />#include <stdio.h><br />#include <stdlib转载 2011-05-19 20:08:00 · 2637 阅读 · 0 评论 -
C语言中逗号运算符和逗号表达式
<br /> 刚开始学习C语言时,对逗号去处符和逗号表达式非常困惑,本文给了我很大的帮助。<br />来自:百度空间-软件工程师<br /> C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:<br /> 3+5,6+8<br />称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为<br /> 表达式1,表达式2<br />逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”转载 2011-05-19 20:14:00 · 957 阅读 · 0 评论 -
宏函数writesb writesw writesl 与readsb readsw readsl详解
writesb(), writesw(), writesl() 宏函数功能:writesb() I/O 上写入 8 位数据流数据 (1字节)writesw() I/O 上写入 16 位流数据 (2字节)writesl() I/O 上写入 32 位流数据 ( 4字节 )原型:引用 #include void writesb (unsignedshortioaddr,void*addr,unsignedlongcount)void writesw (unsign转载 2011-05-20 13:30:00 · 2677 阅读 · 0 评论 -
i++与++i(i--与--i同理)
<br />1.单独用时,是一样的,i++;等同于++i;,相当于i=i+1;<br />若赋值时,a=i++;相当于a=i;i=i+1;<br /> 而a=++i;相当于i=i+1;a=i;<br /><br /><br />2.for循环中,i++等同于++i 如:for(i=0;i<10;i++){...}<br /> for(i=0;i<10;++i){...}<br />原创 2011-05-20 14:16:00 · 1232 阅读 · 1 评论 -
do{...}while(0)的妙用
<br />在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。<br /> 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。 <br /><br />1. do...while(0)消除goto语句。<br />通常,如果在一个函数中开始要分配一些资源,然后在中途执行过程中如果转载 2011-05-20 19:58:00 · 554 阅读 · 0 评论 -
宏的使用问题总结
C(和C++)中的宏(Macro)属于编译器预处理的范畴,属于编译期概念(而非运行期概念)。下面对常遇到的宏的使用问题做了简单总结。关于#和##在C语言的宏中,#的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP) / do{ if (EXP) / fprintf(stderr, "Warning: " #EXP "/n"); } /转载 2011-05-20 21:03:00 · 857 阅读 · 0 评论 -
C/C++中的枚举类型enum
<br />如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。 <br /><br /> 举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它!<br />enum box{pencil,pen};//这里你就定义了一个枚举类型的变量叫box,这个枚举变量内含有两个元素也称枚转载 2011-05-21 08:51:00 · 663 阅读 · 0 评论 -
C语言中各种数据类型长度的总结
<br /><br /><br /><br />下面是我关于C语言中各种数据类型长度的总结:(参考The C Programming Language)<br /> <br />1. c语言中的整数类型有char, short, int, long等几种, 下面是C语言对每种数据类型长度的规定:<br />(a). short和long类型的长度不相同<br />(b). int类型通常同具体机器的物理字长相同<br />(c). short通常是16bits, int通常是16bits or 32bits转载 2011-05-23 09:44:00 · 1689 阅读 · 0 评论 -
结构体成员的内存分布与对齐
我们先看一道IBM和微软的笔试题:IBM笔试题:struct{ short a1;short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof( A)=6, sizeof(B)=8,为什么?注:sizeof(short)=2,sizeof(long)=4微软笔试题:struct example1{ short a ; long b;};stru转载 2011-05-23 09:58:00 · 1083 阅读 · 0 评论 -
结构体的定义、访问以及C与C++中结构体的区别
关于struct 和typedef struct(转载)(2009-10-10 15:15:25)转载标签:杂谈分类:programing<br /> <br />1 首先:<br />在C中定义一个结构体类型要用typedef:<br />typedef struct Student<br />{<br />int a;<br />}Stu;<br />于是在声明变量的时候就可:Stu stu1;<br />如果没有typedef就必须用struct Student st转载 2011-05-23 20:10:00 · 1958 阅读 · 0 评论 -
一个底层驱动函数的解读
<br />/**************************************************************************<br /> * Description<br /> * Write a byte into some one byte register.<br /> *<br /> * Parameters<br /> * addr : The register's address.<br /> * data原创 2011-05-27 17:02:00 · 1843 阅读 · 9 评论 -
工作中与处理器有关的问题总结
<br />经常遇到的典型问题或者说我能想到的有以下这些:Ø字节序Ø字节对齐Ø异常Ø符号位问题Ø堆栈溢出Ø空指针Ø编译&反汇编<br />字节序问题:大端法小端法其实说白了就是一个顺序问题。现代的计算机系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序。常见的字节顺序有两种:Big Endian和Little Endian. Intel X86平台采用Little Endian,而PowerPC、ARM、MIP转载 2011-05-31 13:21:00 · 1237 阅读 · 4 评论 -
往具体地址写数据时遇到的问题
<br /> 在驱动程序中,经常看到*(unsigned int *)0x56000000=0x12;<br />这样的直接给一个地址赋值的语句,这样的语句在应用程序中是不能直接用的,会出现段错误,LINUX系统不允许直接操作物理地址。<br /> <br /> <br />#include<stdio.h><br />#define NFCONF *(volatile unsigned int *)0x0804a008<br />int main()<br />{<br /> NFCONF原创 2011-05-31 14:10:00 · 713 阅读 · 0 评论 -
判断大小端的代码(可使代码兼容大小端)
int x=1;if(*(char *)&x==1) /*小端*/else /*大端*/这段代码在用户空间和内核空间都能使用,能有效的兼容大小端的问题。原创 2011-05-31 19:57:00 · 2649 阅读 · 5 评论 -
检测单个位状态的技巧
static RET_CODE huaya_h2_nand_check_wp(void){ UINT32 status;#ifdef NAND_H2_SIMULATE return 0;#endif /* read ready/busy register */ status = NAND_H2_RD_UINT32(reg_base, NAND_H2_R原创 2011-06-09 14:55:00 · 938 阅读 · 0 评论 -
VS2008发布程序
创建一个基于 Windows 的应用程序在“文件”菜单上单击“新建项目”。在“新建项目”对话框中,选择“项目类型”窗格中的“Visual Basic”,然后单击“模板”窗格中的“Windows 应用程序”。在“名称”框中键入“My Notepad”。单击“确定”关闭对话框。项目添加到“解决方案资源管理器”中,并且“Windows 窗体设计器”打开。在“工具箱”中转载 2011-06-16 19:07:00 · 906 阅读 · 0 评论 -
extern用法详解(转)
<br />1 基本解释<br /> extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。<br /> 另外,extern也可用来进行链接指定。<br />2 问题:extern 变量<br /> 在一个源文件里定义了一个数组:char a[6];<br /> 在另外一个文件里用下列语句进行了声明:extern char *a;<br /> 请问,这样可以吗? <br /> 答案与分析:转载 2011-05-03 19:13:00 · 579 阅读 · 0 评论 -
函数的形参与实参的关系
函数的形参与实参实际上是一个“="的赋值关系,明白了这一点对于就更容易理解一些复杂的形实参的形式,如函数定义:int splitfloat(float x, int * intpart,float *fracpart){ *intpart = int(x);原创 2011-07-07 08:43:10 · 2131 阅读 · 0 评论 -
&号的含义
在C语言中,”&“有两个含义:1.表示取地址 2.表示按位与在c++中,”&“有两个含义:1.表示取地址 2.表示按位与 3.表示引用原创 2011-07-07 09:32:40 · 921 阅读 · 0 评论 -
大小端存储问题
所谓的大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放; 所谓的小端模式,是指数据的低位保存在内存的低地址转载 2011-07-06 14:58:41 · 842 阅读 · 0 评论 -
如何解决“重复定义”
在写较复杂的程序时,时常遇到函数或者变量被重复定义的错误,比喻file1.h中定义了int a;file2.h中也定义了 int a;此时在file.c中既包含file1.h也包含file2.h,在预编译是,file1.h与file2.h都会在file.c中展开,就相当于file原创 2011-07-08 10:59:37 · 8803 阅读 · 3 评论 -
C语言转义字符
在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么。这类字符称为可显示字符,如a、b、c、$、+和空格符等都是可显示字符。另一类字符却没有这种特性。它们或者在键盘上找不到对应的一个键(当然可以用特殊方式输入),或者当按转载 2011-07-09 10:04:25 · 15582 阅读 · 9 评论 -
出现频率最高的笔试题strcpy写法
题目: 已知strcpy函数的原型是: char * strcpy(char * strDest,const char * strSrc); 1.不调用库函数,实现strcpy函数。 2.解释为什么要返回char *。解说: 1.strcpy的实现代码 cha转载 2011-07-13 08:40:38 · 647 阅读 · 0 评论 -
Linux中EXPORT_SYMBOL的用法
Linux中EXPORT_SYMBOL的用法EXPORT_SYMBOL标签内定义的函数对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用。您还可以手工修改内核源代码来导出另外的函数,用于重新编译并加载新内核后的测试。Linux symbol export meth转载 2011-07-11 16:02:27 · 822 阅读 · 0 评论 -
关于C语言头文件对应关系的问题
C语言编译时一个工程中的文件都会进行编译,最后会链接成一个文件,所以头文件只要包含的函数声明,在包含main的主c程序中都能找到。例如:源文件文件中包含func.c,实现了add函数#include "stdafx.h"int add(int a,int b){ retu原创 2011-07-12 21:49:30 · 1178 阅读 · 0 评论 -
比较两个文件中特定位置的字符【总结】
两个文件1.txt 与2.txt ,内容如下:1.txt// line 00 col :00bd1 col :90422 col :90bd3 col :90424 col :91bc5 col :91436 col :91bc7 col :9043原创 2011-07-13 14:16:03 · 783 阅读 · 0 评论 -
micro2440利用LEDS与BUTTONS驱动实现按键控制led灯【开发总结】
最近玩友善之臂的micro2440,实现了按键控制led灯亮灭的功能。在这里总结一下,有什么错误希望高手们能指点一下,同时也希望能够帮到刚学驱动的新手。首先贴出leds驱动程序:#include #include #include #include #include #原创 2011-07-14 10:06:15 · 1628 阅读 · 1 评论 -
二维数组的初始化
二维数组的初始化 二维数组初始化的形式为: 数据类型 数组名[整常量表达式][ 整常量表达式]={ 初始化数据 }; 在{ }中给出各数组元素的初值,各初值之间用逗号分开。把{ }中的初值依次赋给各数组元素。转载 2011-07-23 16:03:16 · 5569 阅读 · 0 评论 -
C/C++程序编译步骤详解
C/C++语言很多人都比较熟悉,这基本上是每位大学生必学的一门编程语言,通常还都是作为程序设计入门语言学的,并且课程大多安排在大一。刚上大学,孩子们还都很乖,学习也比较认真,用心。所以,C/C++语言掌握地也都不错,不用说编译程序,就是写个上几百行的程序都不在话下,但是他们真的知转载 2011-07-25 13:22:16 · 138 阅读 · 0 评论 -
LINUX库文件的生成与使用
1、linux库文件分为静态库和动态库两种。静态库习惯以.a 结尾,而动态库习惯以.so(shared object)结尾。而且必须以lib开头。2、静态库的原则是“以空间换时间”,增加程序体积,减少运行时间;生成:在编译时候,先生成目标文件.o,然后用ar文件对目标文件归档,生转载 2011-07-25 14:52:12 · 717 阅读 · 0 评论 -
深入理解ioctl
一、 什么是ioctlioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数如下:int ioctl(int fd, ind cmd, …);其中fd就是用户程序打开设转载 2011-07-15 14:40:17 · 4177 阅读 · 0 评论 -
区分strcmp 与strncmp 、strcpy与strncpy
strcmp原型:extern int strcmp(const char *s1,const char * s2); 用法:#include 功能:比较字符串s1和s2。 说明: 当s1s2时,返回值>0 即:两个字符串自左向原创 2011-07-12 22:10:32 · 1504 阅读 · 0 评论 -
深入理解typedef
typedef作为类型定义关键字,用于在原有数据类型(包括基本类型、构造类型和指针等)的基础上,由用户自定义新的类型名称。 在编程中使用typedef的好处,除了为变量取一个简单易记且意义明确的新名称之外,还可以简化一些比较复杂的类型声明。比如: typedef转载 2011-07-26 09:29:26 · 742 阅读 · 0 评论 -
深入理解指针函数
1.指针函数的定义 顾名思义,指针函数即返回指针的函数。其一般定义形式如下: 类型名*函数名(函数参数表列); 其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个转载 2011-07-26 09:33:08 · 587 阅读 · 0 评论 -
warning: function declaration isn't a prototype原因分析
warning: function declaration isn't a prototype出现此警告原因:1: 函数没有声明。在你调用的这个函数前面加上该函数的定义即可。main(){test();}test (int a){printf("test: %d\n", a);}转载 2011-07-18 09:09:44 · 6139 阅读 · 0 评论 -
new和delete运算符用于动态分配和撤销内存的运算符
new和delete运算符用于动态分配和撤销内存的运算符new用法: 1. 开辟单变量地址空间 1)new int; //开辟一个存放数组的存储空间,返回一个指向该存储空间的地址.int *a = new int 即为将一个转载 2011-07-19 13:30:44 · 1284 阅读 · 1 评论 -
区别open与fopen
open和fopen的区别:1.缓冲文件系统缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“转载 2011-07-19 17:04:14 · 902 阅读 · 0 评论