GCC
会飞行的小蜗牛
这个作者很懒,什么都没留下…
展开
-
GCC 中与 C / C++ 的库函数名称可能不同了
C/C++中使用 itoa( i, buffer, 10 ); printf( "String of integer %d (radix 10): %s\n", i, buffer ); itoa( i, buffer, 16 ); printf( "String of integer %d (radix 16): 0x%s\n", i, buffer )原创 2012-06-03 09:37:48 · 789 阅读 · 0 评论 -
通过未初始化全局变量,研究BSS段和COMMON段的不同
最近正在重温《程序员的自我修养》一书,由于水平比以前有所提升,所以读书的收获也不一样。下面针对该书3.3.3节BSS段的内容进行更细节的探讨——该节内容不在本文中重复说明了,只说一下结论。对于全局变量来说,如果初始化了不为0的值,那么该全局变量则被保存在data段,如果初始化的值为0,那么将其保存在bss段,如果没有初始化,则将其保存在common段,等到链接时再将其放入到BS转载 2015-08-08 17:13:51 · 483 阅读 · 0 评论 -
C99标准学习笔记(2)——整数提升
Usual Arithmetic Conversion: The integer promotions are performed on both operands. Then the following rules are applied to the promoted operands:If both operands have the same type, then no fur转载 2015-08-08 17:27:13 · 480 阅读 · 0 评论 -
C语言中的类型提升——基础概念,但还有很多人搞不清
今天主要说一下C语言的类型提升的事情。下面是引用的一个例子——这个代码是从一个朋友的博文中复制过来的,但是当时这位朋友没有去说明类型提升的问题,而是阐述汇编的过程。/***************************************************************/int main(){int i;unsigned转载 2015-08-08 16:10:06 · 1225 阅读 · 0 评论 -
从概念及汇编角度解释指针本质
今天一个同事问我一个关于指针的问题,从讨论中,我可以感觉到他对指针的认识还不是很清楚——当然,这不是说我自己认识就清楚,相对清楚而已。指针,大概是C语言中最难理解的概念之一了,但是作为一个工作几年的程序员来说,还是应该对指针的理解要比较清楚。所以我今天就想好好的整理一下自己对指针的理解,即分享了知识和经验,也算自己的一个总结吧。首先,指针这个东西,无疑是C语言中的一个基本概念。转载 2015-08-08 16:38:19 · 581 阅读 · 0 评论 -
GDB调试技巧:调试复杂的宏定义
C语言中的宏定义,有着各种各样的好处和坏处,可谓让人有爱有恨。在大型的工程项目中,为了简洁,为了封装,宏的应用必不可少。但是在调试问题时,因为宏定义是被预定义处理的,所以不会有任何的编译符号和调试信息。这样给调试宏定义时,带来了很大的困难。对于开发人员来说,除了直接肉眼去看宏定义,自己来展开宏定义去确定问题,是否还有其它手段来调试宏定义吗?本文介绍两种调试宏定义的小技巧:转载 2015-08-08 17:59:55 · 8106 阅读 · 0 评论 -
Ubuntu下两个gcc版本切换
Ubuntu系统使用的gcc版本随着发布版本的不同而不同,在编译Android系统时不同的版本推荐用不同的gcc去编译,那么可不可以改变系统的gcc来适应android编译环境的需求呢?答案是可以的。先看看我们系统用的gcc和g++是什么版本# gcc -v可以获得的信息如下gcc version 4.4.6 (Ubuntu/Linaro 4.4.6-11ubunt原创 2015-08-08 11:12:19 · 1099 阅读 · 0 评论 -
代码优化:性能优化不是丑陋代码的遮羞布!
在编写代码的时候,我们往往要在多方面因素之中进行权衡。正确性毫无疑问是最基本的要求,这个都不需要讨论。而如何在可读性和性能之间进行权衡,确实是值得思考的问题。我对于这方面的看法是:我更倾向于可读性为第一位。只有当代码的可读性好的时候,才容易维护,且不容易引起bug。并且当真的需要提高性能的时候,由于代码的良好的可读性,才便于分析代码,找出瓶颈,从而提高性能。转载 2015-08-08 17:43:27 · 535 阅读 · 0 评论 -
gdb 打印抽象数据类型,例如 map vector 等类型
gdb 打印抽象数据类型,例如 map vector 等类型转载 2016-06-29 14:36:22 · 5935 阅读 · 1 评论 -
vector :: erase 出错问题
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素vector::erase()方法有两种重载形式如下:iterator erase( iterator _Where);1.iterator erase( iterator _First, iterator _Last);如果是删除指定位置的元素时:返回值是一个迭代器,指向删除元素下一原创 2016-07-14 15:28:52 · 2936 阅读 · 0 评论 -
buffer 与 Cache 的区别
在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:A bufferis something that has yet to be "written" to disk. A cacheis something that has been "read" from the disk and stored for later原创 2016-08-27 23:40:56 · 455 阅读 · 0 评论 -
Linux多进程实例与代码优化
[html] view plaincopyprint?#include stdio.h> #include stdlib.h> #include time.h> #include pthread.h> #define BUFFER_SIZE 16 struct prodcons { int buffer[BUFFER_SIZE]; pthre转载 2016-11-06 13:46:56 · 567 阅读 · 0 评论 -
string 类
string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常st转载 2016-11-06 13:48:51 · 244 阅读 · 0 评论 -
ecvt把一个浮点数转换为字符串
函数名: _ecvt 功 能: 将双精度浮点型数转换为字符串,转换结果中不包括十进制小数点 用 法: char* ecvt(double value, int ndigit, int *decpt, int *sign); 详细解释:ecvt函数把一个双精度浮点数转换成一个字符串。value参数是要转换的浮点数。这个函数存储最多ndigit个数字值作为一个字符串,并添加一个空数字原创 2016-11-06 13:45:24 · 1529 阅读 · 0 评论 -
container_of() 宏
在学习Linux驱动的过程中,遇到一个宏叫做container_of。 该宏定义在include/linux/kernel.h中,首先来贴出它的代码:/** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the me原创 2016-10-16 21:12:10 · 254 阅读 · 0 评论 -
使用GCC扩展attribute,在main函数外进行操作
以前知道这个GCC扩展特性,但是一直没有试过。今天写了个小的测试程序试验一下。#include stdlib.h>#include stdio.h>static void __attribute__ ((constructor)) my_init(){ printf("my_init\n");}stati转载 2015-08-08 17:01:01 · 536 阅读 · 0 评论 -
C99标准学习笔记(3)——操作符&和[]
今天的笔记没有一个很好的标题,也很短。主要是针对&与[]操作符A postfix expression followed by an expression in square brackets [] is a subscripteddesignation of an element of an array object. The definition of the subscript转载 2015-08-08 17:24:53 · 630 阅读 · 0 评论 -
正整数的 二进制表示 中 从低位向高位 第1个0/1出现位置 的计算方法
正整数的 二进制表示 中 从低位向高位 第1个 0 出现位置 的计算方法int find_first_0_occur_binary_expression(int n)//由其二进制数的低位往高位找{ int zeroPosition = 0; while ((n & 1) != 0) { zeroPosition++; n = n >> 1; }原创 2012-08-18 20:18:08 · 3469 阅读 · 0 评论 -
打印变量地址的方法
#include "stdafx.h"int main(int argc, char* argv[]){ int _1,_2,_3; printf("_1=%p\n",&_1); printf("_2=%p\n",&_2); printf("_3=%p\n",&_3); return 0;}#include "stdafx.h"原创 2013-03-14 11:57:00 · 759 阅读 · 0 评论 -
函数指针的使用
#include "stdafx.h"int (*pfun)(int n);int fun(int n){ int m=5; m *= n; return m;}int main(int argc, char* argv[]){ pfun = fun; printf("pfun=%d\n",pfun(7)); return 0;}原创 2013-03-14 12:03:39 · 482 阅读 · 0 评论 -
#define 与 typedef 的区别
可以看一下如下的例子#define peach intunsigned peach i; /*这样是没问题的*/typedef int banana;unsigned banana i; /* 错误!非法*/在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而#define则不然,在如下这种情况下:#d原创 2013-03-14 11:36:08 · 658 阅读 · 0 评论 -
关于结构体初始化的相关总结
1. 这样定义并初始化是可以的原创 2014-05-24 20:39:37 · 1642 阅读 · 0 评论 -
STM32串口一直进中断解决方法
今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。问题描述:在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下:转载 2014-06-14 00:11:27 · 23279 阅读 · 11 评论 -
Source Insight配置WinAVR的具体步骤
Source Insight配置WinAVR的具体步骤 配置WinAVR主要分2步:1.选择Options->Custom Commands a. 点击ADD按纽,在Command: 内写入编译器名,如WinAVR Compile b. 在Run: 内写入命令make clean;make all; c. 千万不要在Dir加目录,我试过了,make cle原创 2014-06-15 00:49:03 · 1065 阅读 · 0 评论 -
AVR-GCC开发5种软件组合(GCC+PN/AS/VC/SI/UE)极速上手指引(菜鸟适用)
1.GCC+PN(WinAVR-20071221)转载 2014-06-15 00:14:17 · 1338 阅读 · 0 评论 -
#define 的妙用
1. strcmp() 函数用于比较两个字符串,但存在一个问题是,当两个字符串相等时,返回值为0,如下的使用可能会使人费解 if(!strcmp(s, "volatile")) return QUALIFIER; 返回值 0, 使条件语句结果为假,所以我们不得不对其取反,得到想要的结果。 解决方法:建立宏定义: #define STRCMP(a, R, b)原创 2013-03-14 11:11:31 · 812 阅读 · 0 评论 -
SourceInsight 换行缩进过度的解决方法
问题描述:原创 2014-06-22 09:41:31 · 6643 阅读 · 1 评论 -
GCC-AVR 编写中断服务函数的注意事项
//注意:本文使用的GCC-AVR版本为WinAVR20100110原创 2014-06-22 14:24:08 · 4279 阅读 · 3 评论 -
c语言危险库函数及解决方案
转载 2015-03-01 14:03:34 · 663 阅读 · 0 评论 -
#if #elif #define typedef 使用时的注意事项
假设有如下代码需要兼容三个版本这样无法完成任务的无论typedef enum{ FIRST, SECOND, THIRD,};#define NUM THIRD#if (NUM == FIRST)#define VAR 1#elif(NUM == SECOND)#define VAR 2#elif(NUM == THIRD)#defi原创 2015-04-23 23:41:28 · 1659 阅读 · 0 评论 -
C99标准学习笔记(4)——sizeof运算符
本来认为对sizeof已经有了比较清晰的认识,没想到一读标准,发现自己还是理解错了。因为我使用sizeof都是用于静态的sizeof,也就是说sizeof的值在编译阶段就是可以确定的。当时将sizeof理解为一个宏了,用于计算类型或者变量所占用的字节数。读过C99标准,才发现sizeof既不是一个宏,更不是一个函数,而是一个operand,一个运算符啊——当然如果你愿意将operand看作一个函数转载 2015-08-08 17:22:09 · 3111 阅读 · 4 评论 -
Linux下getopt()函数的简单使用
最近在弄Linux C编程,本科的时候没好好学啊,希望学弟学妹们引以为鉴。好了,虽然啰嗦了点,但确实是忠告。步入正题:我们的主角----getopt()函数。英雄不问出处,getopt()函数的出处就是unistd.h头文件(哈哈),写代码的时候千万不要忘记把他老人家include上。 再来看一下这家伙的原型(不是六耳猕猴):int getopt(i转载 2017-09-14 14:21:40 · 515 阅读 · 0 评论