c 语言相关
mrwangwang
这个作者很懒,什么都没留下…
展开
-
va_start用法
1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...);2:函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:#include void fun(int a, ...){int *temp = &a;temp++;for (int i = 0; i转载 2012-09-07 10:44:46 · 997 阅读 · 0 评论 -
c语言中的宏 .
1.字符串化操作符#例如:#define macro(x) #x宏展开后x会变为”x”.另外,根据c语言的特性,两个字符串挨在一起(或中间间隔几个空格)时会自动粘帖,所以经常有如下的用法:#define DEBUG(n)printf(#n” = %d\n”, n);需要注意的是被引号引起来的部分是不是进行宏扩展的。C语言是按词扫描的,像MACROXX中的MACRO也不会被宏展开转载 2013-11-08 14:43:56 · 622 阅读 · 0 评论 -
C语言中变量的作用域 .
C语言中变量的作用域C语言中所有变量都有自己的作用域,申明变量的类型不同,其作用域也不同。C语言中的变量,按照作用域的范围可分为两种,即局部变量和全局变量。一、局部变量局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。例如:int f1(int a) /*函数f1*/{ in转载 2013-12-02 15:48:02 · 861 阅读 · 0 评论 -
C语言中长度为0的数组 .
前面在看Xen的源码时,遇到了一段代码,如下所示:注意上面最后一行的代码,这里定义了一个长度为的数组,这种用法可以吗?为什么可以使用长度为0 的数组?长度为的数组到底怎么使用?……这篇文章主要针对该问题进行简单的讲解。废话不多说了,现在就开始。长度为的数组在标准c和c++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为。但在GNUc中,这种用法却是合转载 2013-12-26 16:53:47 · 816 阅读 · 0 评论 -
Linux GCC常用命令
1简介2简单编译2.1预处理2.2编译为汇编代码(Compilation)2.3汇编(Assembly)2.4连接(Linking)3多个程序文件的编译4检错5库文件连接5.1编译成可执行文件5.2链接5.3强制链接时使用静态链接库1简介GCC 的意思也只是 GNU C Compiler 而已。转载 2014-05-04 20:57:36 · 483 阅读 · 0 评论 -
linux下C语言实现多线程通信—环形缓冲区,可用于生产者(producer)/消费者(consumer)
操作系统:ubuntu10.04前言: 在嵌入式开发中,只要是带操作系统的,在其上开发产品应用,基本都需要用到多线程。 为了提高效率,尽可能的提高并发率。因此,线程之间的通信就是问题的核心。 根据当前产品需要,使用 环形缓冲区 解决。一,环形缓冲区的实现 1,cbuf.h点击(此处)折叠或打开#ifndef __CBUF_H__ #define __CBUF...转载 2014-05-28 11:39:36 · 4314 阅读 · 2 评论 -
[置顶] linux中fork()函数详解(原创!!实例讲解)
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来转载 2014-05-28 14:58:26 · 567 阅读 · 0 评论 -
关于typedef的用法总结
不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。用途一:定义一种类型的别转载 2014-08-13 10:25:41 · 563 阅读 · 0 评论 -
linux动态编译和静态编译
为了使用方便,可以把这两个函数接口定义为动态链接库或静态链接库。用动态链接库编译生成的可执行文件需调用.so文件方可正常运行,灵活但稍显麻烦;用静态链接库编译生成的可执行文件可直接运行,不用再调用如.so般的依赖库文件,简单但不灵活。静态链接库:1、编译生成目标文件gcc -c struct.c2、创建静态库ar cqs libstruct.转载 2015-03-10 17:16:59 · 399 阅读 · 0 评论 -
extern "C"的用法解析
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有转载 2015-03-10 17:32:42 · 377 阅读 · 0 评论 -
我读过的最好的epoll讲解
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要转载 2015-03-14 14:34:49 · 525 阅读 · 0 评论 -
char *a 与char a[] 的区别
char *a = "hello" 中的a是指向第一个字符‘a'的一个指针char a[20] = "hello" 中数组名a也是执行数组第一个字符‘h’的指针但二者并不相同:看实例:把两个字符串相加:结果:对比:结果:把字符串加到指针所指的字串上去,出现段错误,本质原因:*d="0123456789"存放在常转载 2015-08-04 13:25:57 · 465 阅读 · 0 评论 -
在EEPROM中保存浮点数的方法
最近一个项目,需要在EEPROM中保存浮点数,于是想到浮点数占四个字节,直接移位,发现得到的char型是0,看来这个方法不可行。搜索论坛,高人提议用联合体来解决,联合体看似与结构体相似,其不同之处在于结构体中每个变量占用不同的内存,而联合体共用一段内存,这就给保存浮点数提供了极大的便利。比如我要保存一个浮点数a,我定义一个联合体union{float x;uchar s...转载 2015-11-07 22:04:09 · 5854 阅读 · 0 评论 -
C语言函数sscanf()的用法
IEEE、万方文献及国内外专利下载,请关注微信公众号IEEE 在我的学习过程中,从文件读取数据是一件很麻烦的事,所幸有sscanf()函数。 C语言函数sscanf()的用法sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: int sscanf( string str, string fmt, mixed var1, mixed var2 .....转载 2019-02-11 11:21:23 · 597 阅读 · 0 评论 -
__attribute__ ((format (printf, 2, 3))); 介绍
功能:__attribute__ format属性可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。format属性告诉编译器,按照printf, scanf等标准C函数参数格式规则对该函数的参数进行检查。这在我们自己封装调试信息的接口时非常的有用。format的语法格式为:format (archet...原创 2019-07-31 23:04:59 · 1059 阅读 · 0 评论 -
#、##、__VA_ARGS__和##__VA_ARGS__的作用
一、#用来把参数转换成字符串例子一:#define P(A) printf("%s:%d\n",#A,A);int main(int argc, char **argv){int a = 1, b = 2;P(a);P(b);P(a+b);system("pause");}...原创 2019-08-09 21:18:17 · 1618 阅读 · 1 评论 -
字符串拷贝函数memcpy和strncpy以及snprintf 的性能比较
问题:函数memcpy(dest, src, sizeof(dest))、strncpy(dest, src, sizeof(dest))和snprintf(dest, sizeof(dest), “%s”, src)都可以将src字符串中的内容拷贝到dest字符串中。哪一种方式效率最高呢?就是说,哪种方式性能最好呢?解决办法:建立三个文件test_memcpy.c,test_strncp...原创 2019-08-11 22:48:40 · 981 阅读 · 0 评论 -
UDP组播接收端解析
UDP组播接收端解析网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包。在广域网中,还涉及到路由器支持组播路由等,但本文希望以一个最为简单的例子解释清楚协议栈关于组播的一个最为简单明了的工作过程,甚至,我们不希望涉及到 IGMP包。 我们先从一个组播客户端的应用程序入手来解析组播的工作过程转载 2013-11-21 11:42:29 · 1130 阅读 · 0 评论 -
va_start和va_end使用详解
本文主要介绍va_start和va_end的使用及原理。 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表void foo(...);voi转载 2013-09-06 10:16:51 · 535 阅读 · 0 评论 -
extern C的作用详解
extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。 这个功能十分有用处转载 2012-09-09 14:42:03 · 602 阅读 · 0 评论 -
__extension__ typedef int __ssize_t;是什么意思
这是.c文件经过gcc -E 预处理得到的.i文件中的内容,其中__extension__是什么作用gcc对标准C语言进行了扩展,但用到这些扩展功能时,编译器会提出警告,使用__extension__关键字会告诉gcc不要提出警告。gcc选项-ansi指示编译器编译符合标准的程序,但是不限制其它方式,只要它与标准不冲突。这样,asm、typeof、inline都将无效,但是__asm_转载 2012-09-17 09:31:04 · 7350 阅读 · 0 评论 -
Using GNU C __attribute__
One of the best (but little known) features of GNU C is the __attribute__ mechanism, which allows a developer to attach characteristics to function declarations to allow the compiler to perform more e转载 2012-09-17 13:13:37 · 528 阅读 · 0 评论 -
宏__THROW
Linux/FreeBSD内核的源文件里常会出现这个东东。其实并不复杂,只是简单的宏定义,可以参考以下代码;:/* GCC can always grok prototypes. For C++ programs we add throw() to help it optimize the function calls. But this works only with转载 2012-09-17 09:42:31 · 594 阅读 · 0 评论 -
(转载)环形缓冲区的实现原理(ring buffer) .
环形缓冲区的实现原理(ring buffer) 在通信程序中,经常使用环形缓冲区作为数据结构来存放通信中发送和接收的数据。环形缓冲区是一个先进先出的循环缓冲区,可以向通信程序提供对缓冲区的互斥访问。1、环形缓冲区的实现原理环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓转载 2012-10-15 10:23:18 · 1682 阅读 · 0 评论 -
【转】C/C++ Memory Layout写的很好 .
C/C++ Memory Layout2011-03-07 18:29 by 吴秦, 1529 visits, 网摘,收藏,编辑为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内存布局对调试程序非常有帮助,可以知道程序执行时,到底做了什么,有助于写出干净的代码。本文的主要内容如下:源文件转换为可执行文件 可执行程序组成及内存布局 数据存储类别转载 2012-10-15 09:57:53 · 709 阅读 · 0 评论 -
vmlinuz、zImage和bzImage的关系 .
vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。 vmlinuz的建立有两种方式。一是编译内核时通过“make zImage转载 2012-10-15 10:33:43 · 505 阅读 · 0 评论 -
section ("section-name")
Normally, the compiler places the objects it generates in sections like data and bss. Sometimes, however, you need additional sections, or you need certain particular variables to appear in special se转载 2012-11-07 10:34:03 · 1235 阅读 · 0 评论 -
数组指针和指针数组的区别
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a;转载 2013-02-18 21:57:11 · 623 阅读 · 0 评论 -
sort()和qsort()
有区别的,应该是sort函数的效率更高吧。qsort(数组名,数组长度,数组中每个元素大小,compare); compare函数的写法决定了排序是升序还是降序。需要#include例如:int compare(const void*a,const void*b){return *(*int)a-*(int*)b;} 示例:qsort(a,10,sizeof(int),compa转载 2013-03-04 09:04:36 · 622 阅读 · 0 评论 -
C语言不通标准的限制
限制 C89标准 C99标准数据块的嵌套层数 15 127条件语句的嵌套层数 8 63内部标识符中的有效字符个数 31 63外部标识符中的有效字符个数 6 31结构或联合中的成转载 2013-02-24 11:28:13 · 387 阅读 · 0 评论 -
一步一步写算法(之hash表)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 hash表,有时候也被称为散列表。个人认为,hash表是介于链表和二叉树之间的一种中间结构。链表使用十分方便,但是数据查找十分麻烦;二叉树中的数据严格有序,但是这是以多一个指针作为代价的结果。hash表既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。转载 2013-03-12 20:34:32 · 635 阅读 · 0 评论 -
【转】__attribute__ 之weak,alias属性
//strong.c#include void symbol1(){ printf("%s.%s\n",__FILE__,__FUNCTION__);}//weak.c#include void symbol1() __attribute__ ((weak,alias("symbol222")));//void symbol1() __attribute_转载 2013-04-11 10:36:55 · 2188 阅读 · 0 评论 -
C语言 ## __VA_ARGS__ 宏
在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如: ?12#define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt, ##arg)用可变参数宏(variadic macros)传递可变参数表 你可能很熟悉在函数中使用可变参数表,如:转载 2013-04-25 17:02:25 · 824 阅读 · 0 评论 -
宏与内联函数(面试常考) .
第一部分:宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开转载 2013-04-26 13:24:12 · 615 阅读 · 0 评论 -
__attribute__ ((aligned (n), packed))
下记转载:http://chentravel.blogspot.com/2007/11/attribute.htmlGNU C扩展的__attribute__ 机制被用来设置函数、变量、类型的属性,其用得较多的是处理字节对齐的问题。__attribute__ 的语法为:__attribute__ ((语法列表))参数aligned(number) [number为最小对齐的字节数]是用得...转载 2013-05-16 15:31:04 · 6532 阅读 · 0 评论 -
写给C语言初学者的话
--www.chinaunix.net(ldap) 前些天我写了一篇“Unix C语言值得注意的地方”一贴,回贴中谈到学习国外的开源软件中的高质量代码的问题,但是有朋友跟我说,在看代码的过程中感觉难度很大,想想也是如此,动辄十几万行的程序如果没有人指点的话是很难找到切入点的,所以我撰写了此文希望能对广大C语言爱好者有所帮助,在文章中有很多煽情的地方还请大家原谅,因为这篇文章使我想到了转载 2013-08-09 08:44:26 · 517 阅读 · 0 评论 -
snprintf函数使用总结
一直有接触snprintf,经久不用知识点又会模糊,记录下来以便日后查看【依赖头文件】#include<stdio.h>【函数原型】int snprintf(char *str, size_t size, const char *format, ...);【函数参数】str:目标字符串;size:拷贝字节数(Bytes); format:源字符串; ...格式...原创 2019-08-11 22:50:54 · 477 阅读 · 0 评论