一般用于头文件开始,预编译时,只插入一次此头文件。
例如 头文件 "grandfather.h"
#pragma once
#ifndef GRANDFATHER_H
#define GRANDFATHER_H
struct foo
{
int member;
};
#endif /* GRANDFATHER_H */
当这段程序多次被include ( 多文件编译,相互include时会遇到),只插入和编译一次。
#pragma once 的编译速度 比 #ifndef GRANDFATHER_H #define GRANDFATHER_H ..快,
所以往往 全用。
二, string char 类型转换
C下面没有string类型。字符串就是字符数组嘛,自己处理好了。没有单独的string类型。
1,string 转化为
char* string tstr;
char *tchtch = (char *)tstr.c_str();
1、sizeof会计算实际内存空间,strlen会计算C风格的字符串的实际字符数(不包括\0)。
2、以字符串形式出现的,编译器都会自动添加\0。
3、char a[6] = "Hello";这是不敌的,因为后者是一个常量。
4、char a[] = "Hello";是正确的,因为a相当于一个指针。
5、char a[] = "Hello";等价于char a[] = {"Hello"};
6、char *s = "Hello";这个也带有\0。
7、c++中的c风格字符串时带有\0的字符数组。
看了太多关于内存使用上出问题的代码,感觉很多人知道new,知道malloc,却不知道该如何管理,觉得有必要讲讲c/c++程序对内存占用类型的区别.
引用一个前辈注释的例子.请新手朋友仔细看看每一处,你是否都清楚?
//main.cpp
int a = 0; //a,全局变量,存储在全局初始化区
char *p1; //p1,全局变量指针,全局未初始化区(注意,p1没有new或者malloc,它是一个空指针,你乱用就是野指针,但是它是地址,本身也占32位的空间)
main()
{
int b; //main()函数的栈区
char s[] = "abc"; //main()函数的栈区
char *p2; // p2也是指针,main()函数的栈区
char *p3 = "123456"; //123456\0在常量区,p3在main()函数的栈区
static int c =0; //全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20); //分配得来得10和20字节的区域就在堆区。但是p1在全局区,p2在main()函数的栈区,你懂了吗?
strcpy(p1, "123456"); // 123456\0放在常量区,编译器可能会将它与p3所指向
的"123456"优化成一个地方
}