sizeof是一个运算符,会在编译时计算出变量的长度。
预处理指令要写在一样,如果太长可以使用续行符''。
/* Find the size of an variable */
#define sizeof_var( var ) ((size_t)(&(var)+1)-(size_t)(&(var)))
/* Find the size of a
data type */
#define sizeof_type( type ) (size_t)((type*)1000 + 1 )-(size_t)((type*)1000)
|
#include <stdio.h> #define my_sizeof(L_Value) ( (char *)(&L_Value + 1) - (char *)&L_Value ) int main() { int i; char *p1 = (char *)(&i + 1); char *p2 = (char *)&i; printf("%xn",(int)p1); printf("%xn",(int)p2); printf("the size of i is %d n",p1 - p2); return 0; } |
c++程序避免不了处理字符串,处理字符串就要用到库函数,你就会看到string头文件。
今天写程序碰到一个错误
Error: The function "srtncpy" must have a prototype.
开始研究了半天,以为头文件包含错误,反复试了各种类型<> "" string.h cstring string都报这个问题。
后来想还是google一下,google还被墙,百度一下没结果,心想不至于没人遇到吧,
仔细看了一下错误提示,发现是自己拼错了。
顺便也回顾一下头文件相关姿势吧
<> 尖括号""双引号包含头文件的区别是搜索路径不同,
<>尖括号搜索系统库路径
""双引号搜索当前路径,当前路径没有搜索系统库路径
string头文件在c++里有三种含义
#include <string> c++标准库提供的string类
#include <string.h> c标准库提供的字符串函数
#include <cstring> c++对标准c字符串处理函数的c++增强
在Linux下产生并调试core文件 先看看我用的是个什么机器:
$ uname -a
Linux dev 2.4.21-9.30AXsmp #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux
再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。
阅读全文...
先阐述几个概念:
Pascal Case :当标识符由两个或者两个以上单词组成的时候,单词之间不加其他的符号,并且每个单词首字母都必须大写,例如PascalCase。
camel Case: 当标识符由两个或者两个以上单词组成的时候,单词间不加其他的符号,并且第一个单词以小写开头,其他单词以大写开头。例如camelCase。
Unix/Linux变量命名方法:当程序由两个或两个以上单词组成的时候,单词都以小写开头,并且以_连接。
下面是Google C++编程规范的一些内容:
一、命名
1)普通变量:linux命名规范 。例如:string table_name;
2)常量: k+PascalCase。例如 const int kDayInAWeek = 7;
3)类私有成员: linux命名规范+_。 例如:int parament_count_;
4)普通函数命名:PascalCase。例如:AddTableEntry()。
5)存储函数:linux命名方法。例如:
int num_entries() const {return num_entries_};
void set_num_entries(){int num_entries};
6)枚举:值为全大写组成的单词,单词以_分割。例如MY_ENUM_VALUE
7)类名、结构名:PascalCase
二、函数参数
输入参数在钱,输出参数在后。
三、头文件排序
C系统头文件
C++系统头文件
其他库头文件
本项目内头文件
四、文件注释
1、创建时间 作者
2、修改时间 修改人 修改函数列表
3、头文件中,首先生命该类的作用,对函数的用法作简单说明
五、其他约定
1、每行不要超过80个字符,包含长路径或者头文件保护的情况除外;
2、设定编辑器将tab转换为空格,最好为4个空格;
3、空循环体使用{}、continue,而不是一个分号;
4、不要使用匈牙利命名法。
Linux下的动态链接库的制作和使用方法,完全是根据个人理解和经验总结,有不对的地方还请大家指正。
动态链接库的生成:
代码上与写静态链接库没什么区别,主要是在编译时,以两个文件举例:
/*mylib.h*/
void Print();
/*mylib.c*/
#include
#include "mylib.h"
void Print()
{
printf("This is in mylibn");
}
编译方法如下:
gcc -fpic -shared mylib.c -o mylib.so
此时将生成mylib.so动态链接库文件。
阅读全文...
C++类的超前声明
解决了两个调试问题。
问题一 如何定义使类的成员变量保存的是该类的一个实例?
答: 类自身不能作为其成员变量,其成员变量只能定义为类(实例)的指针或引用。
class CNode
{
private:
CNode m_Node; // 出错
CNode *m_pNode; // 正确
}
问题二 两个类相互引用,如何声明?(超前声明)
答:
class A;
class B
{
private:
A m_a; // 错误
A *m_pa; // 正确
}
class A
{
B m_b;
B *m_pb;
}
其实两个问题都是类聚合时的强依赖问题。
一般此类错误都是由于Makefile文件该行命令语句,没有以Tab开头。
编辑/etc/inputrc
去掉#set bell-style none前的井号,就可以脱离烦恼的滴滴声了。赶快去试试吧。
当使用visual stdio建立工程后,默认的入口时int _tmain(int argc, _TCHAR* argv[]),而不是常见的main()函数。
实际上_tmain是main的别名定义在#include <tchar.h>中的#define _tmain main,必须包含此头文件才能编译通过。编译后认为main。
默认是把#include <tchar.h>放在预编译头文件中stdafx.h中的,大家可以打开看看。
对了,还没说为什么要用_tmain(),是为了保证移植unicode而加入的(一般_t、_T、T()这些东西都和unicode有关系)
近期评论