随笔分类 - C语言
摘要:前面,我总结过关于va_list,va_start,va_arg,va_end的一些知识点: http://www.cnblogs.com/mydomain/archive/2010/07/27/1785667.html http://www.cnblogs.com/mydomain/archive/2010/12/06/1898140.html 今天看到一篇文件,写的也言简意赅,喜欢就转载一下,...
阅读全文
摘要:在c和c++中,可变参数使用的最多函数有:scanf,printf,以及fprintf,fscanf,sprintf等,MFC也提供CString::Format实现可变参数。本示例通过va_list来实现自己的可变参数函数,实现程序写日志功能。通过可变参数实现日志打印// ForATest.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include "Windows.h"#include "iostream"using namespace std;#include "string&quo
阅读全文
摘要:C/C++编程规范精述(匈牙利命名法)1、排版上不同小结构间要空行分开,子逻辑项相对父逻辑项要缩进;{及if,while等判断语句应独占行并对齐,且后加空格以显突出。2、注释位于相应代码上面或右旁边。且与其它代码空行或空格隔开。3、变量命名风格:采用UNIX 的全小写加下划线的风格或大小写混排的方式,不要使用大小写与下划线混排的方式,但用作特殊标识如标识成员变量或全局变量的m_和g_,其后加上大小写混排的方式是允许的。定义标识符(变量名/函数名)应体现code is document:类型的第一个字母小写组合 + 有意义的单词。全局变量和函数名前应加模块名。如DWORD dwSum = 0;定
阅读全文
摘要:#include <iostream> using namespace std; void f1(int a,int b) { } int main() { f1(3,4); system("pause"); } 将上述代码反汇编如下(vs05debug): int main() { 004113D0 push ebp ;/保存栈基址 004113D1 mov ebp,esp ;将...
阅读全文
摘要:1、(Microsoft Specific)__stdcall主要指明了恢复堆栈的规则:在主调用函数中负责压栈,在被调用函数中负责弹出堆栈中的参数,并且负责恢复堆栈。 The __stdcall calling convention is used to call Win32 API functions. The callee(被调用者) cleans the stack, so the comp...
阅读全文
摘要:预处理宏预处理器(Preprocessor)定义了读取源代码、对代码预先翻译以及编写供编译器读取的新代码的过程。预处理先于编译器对源代码进行处理。C/C++ 语言没有内置工具在编译时间包含其他源文件、宏定义,或根据条件包含或排除一些代码行的编译时指令。预处理器提供了这些能力。虽然当前大多数编译器内部集成了预处理器,人们还是认为预处理独立于编译器的过程。预处理器读取源代码,查找预处理指令语句和宏调用...
阅读全文
摘要:#,## 1、在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组。(原文:When you put a # before an argument in a preprocessor macro, the preprocessor turns that argument into a character array. This, combined with the f...
阅读全文
摘要:1、宏不可以出现在递归中。预处理指示#define,#ifdefine,#endif#defineFLAG//...#ifdefFLAG//...#endif//FLAG#define的反意是#undef#ifdef的反意是#ifndef对于包含结构的每个头文件,应当首先首先检查这个头文件是否已经包含在特定的CPP文件中了。通过测试预处理器的标记来检查。#ifndefHEADER_FLAG#def...
阅读全文
摘要:位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。含有位段的结构体类型称为位段结构。位段成员必须被声明为unsigned或int类型。 位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。 位段结构中位段的定义格式为: unsigned <成员名>:<二进制位数> 例如: struct b...
阅读全文
摘要:while((*from++=*to++)=='\0')这一句的执行顺序:*from=*tofrom++to++判断*from=='\0'?优先级:http://www.cnblogs.com/mydomain/archive/2010/08/31/1814224.html
阅读全文
摘要:1基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 另外,extern也可用来进行链接指定。使用extern时候要严格对应声明时的格式。 extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。2问题:extern“C” 在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢? C++语言在编译的时候为了解决函数的多态问题,会将函数
阅读全文
摘要:在C语言中,程序可在任意花括号后定义变量,在C++中,允许在程序中任何地方声明变量,它的优点是可在使用该变量附近定义他。当在一个块内定义了一个变量,这个变量的作用域是从定义点起到当前块的结束以及所有在当前块中出现的子块。作用域:变量名有效的范围。生存期:变量在程序中存在的时期(全局,局部两种)。存储方式:auto,register,extern,static存储空间类型:栈(stack):自动分配...
阅读全文
摘要:在程序设计实践一书中,作者说如下程序会出问题:intmain(){charbuf[20];gets(buf);if(...)}这是因为gets不限制读入数据的长度,所以应当由fgets来代替。这一点本人同意。但是作者有一个观点,本人不能赞同。作者说,如果gets中读入的数据太多,可能会把函数(gets)的返回地址也覆盖。我们都知道,函数的返回地址在栈中,就本程序而言,其在栈中的位置的地址肯定比bu...
阅读全文
摘要:我想接着讨论一下,如果是数组,那么他与其它变量在栈上是如何分配存储顺序的。我们已经知道,栈是从高地址到低地址生长,而数组是从低地址到高地址生长,那么,这两种不同的生长方式如何相容呢?于是我们设计如下程序。#include"iostream"usingnamespacestd;intmain(){charch1='a';chararr[5];charch2='b';cin>>arr;pr...
阅读全文
摘要:2)接下来,我们将讨论第二个问题,那就是函数返回值与参数在栈上存放顺序。我们设计如下程序:#include"iostream"usingnamespacestd;inttest(inta,intb){intc;printf("%p\n",&b);//最后一个参数printf("%p\n",&a);//第一个参数printf("%p\n",&c);//函数的返回值地址retu...
阅读全文
摘要:一直以来,在思考函数调用中,其参数,返回地址的关系。在以前的一篇文章中,也曾看到过这种关系:函数在堆栈中的分布情况是,地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段。[1]于是,我进行了测试。我们都知道:在函数内定义的普通变量放在栈上,而只有用malloc,new等申请的内存,才放在堆上。用static标识的变量,和全局变量一样,放在全局存储区。[2]而在栈上存放的变量,一般都是...
阅读全文
摘要:一、相关文章1、C++中static的含义及名字控制http://blog.163.com/zhoumhan_0351/blog/static/39954227201031775648201/C/C++中,static有两层含义:在固定的地址上进行存储分配,也就是说对象是在一个特殊的静态数据区上创建的,而不是每次函数调用时在堆栈上产生的。第二层含义是:对一个特定的编译单位来说是局部的。2、stat...
阅读全文
摘要:今天看别人写的代码,其中涉及有va_arg, va_end, va_start部分。于是翻阅了一些资料,总结了一下。由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;于是人们想出了用指针参数来解决问题。关于这一部分标准库的定义,VS和unix定义的是不一样的,可以参见MSDN关于这一部分的解释。type va_arg( va_list arg_ptr, type );void va_end( va_list arg_ptr );void va_start( va_list arg_ptr ), (UNIX version)void va_start( va_list arg_p
阅读全文

浙公网安备 33010602011771号