cpp 临时记录

来源:互联网 发布:rgb和hsl转换算法实现 编辑:程序博客网 时间:2024/05/11 03:48


ifdef 和 #if defined 的区别在于,后者可以组成复杂的预编译条件,比如

if defined (AAA) && defined (BBB)

xxxxxxxxx

endif

if defined (AAA) || VERSION > 12

xxxxxxxxx

endif

而#ifdef 就不能用上面的用法,也就是说,当你要判断单个宏是否定义时

ifdef 和 #if defined 效果是一样的,但是当你要判断复杂的条件时,只能用 #if



std 首先std是一个命名空间,
如果你点进std去看的话会看见有这样的写法 namespace std
c++ 库中所有的标识符都被定义

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using关键字。
using std::cout;
using std::endl;
以上程序可以写成
cout << std::hex <<3.4 << endl;
3、最方便的就是使用using namespace std;这样命名空间std内定义的所有标识符都有效(

曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写:
cout << hex << 3.4 << endl;


The following code shows a header file which can be used by C and C++

当在头文件使用如下这样的语句块,意味着c和cpp都可以使用这个头文件

client applications:
// MyCFuncs.h

ifdef __cplusplus //表示如果宿主程序是cpp程序时

extern “C” { //only need to export C interface if
// used by C++ source code

endif

__declspec( dllimport ) void MyCFunc();
__declspec( dllimport ) void AnotherCFunc();

ifdef __cplusplus

}

endif

extern “C”表示编译生成的内部符号名使用C约定。

定义条件编译,相当于定义了一个条件
它的用法:一般用于条件编译,比如说有一段代码我在linux环境下是一种写法,在windows

下又是一种写法。这个时候,我们就可以这样写

define WINDOWS

if defined(WINDOWS)

xxx //do something

else

xxx

endif



1 #if 0
2
3 code
4
5 #endif

(1)code中定义的是一些调试版本的代码,此时code完全被编译器忽略。如果想让code生效

,只需把#if 0改成#if 1

(2)#if 0还有一个重要的用途就是用来当成注释,如果你想要注释的程序很长,这个时候

if 0是最好的,保证不会犯错误。(但是林锐的书上说千万不要把#if 0 来当作块注释使

用) #if 1可以让其间的变量成为局部变量。

(3)这个结构表示你先前写好的code,现在用不上了,又不想删除,就用这个方法,比注释

方便。



关于GNU CC的某些 Attribute说明

attribute((format(printf,m,n)))
attribute((format(scanf,m,n)))

//m=1;n=2
extern void myprint(const char *format,…) attribute((format(printf,1,2)));
//m=2;n=3
extern void myprint(int l,const char *format,…)
attribute((format(printf,2,3)));

其中参数m与n的含义为:
m:该函数myprint的第几个参数为需要格式化的字符串(format string);
n:该函数myprint的的可变长参数,即参数“…”里的第一个参数在函数myprint所有参数

总数中是排在第几的位置,

注意,有时函数参数里还有“隐身”的呢,后面会提到;
在使用上,attribute((format(printf,m,n)))是常用的,而另一种却很少见到。下面

举例说明,其中myprint为自己定义的一个带有可变参数的函数,其功能类似于printf:

需要特别注意的是,如果myprint是一个函数的成员函数,那么m和n的值可有点“悬乎”了

,例如:
//m=3;n=4
extern void myprint(int l,const char *format,…)
attribute((format(printf,3,4)));
其原因是,类成员函数的第一个参数实际上一个“隐身”的“this”指针。(有点C++基础

的都知道点this指针,不知道你在这里还知道吗?)


内联能提高函数的执行效率,为什么不把所有的函数都定义成内联函数?
如果所有的函数都是内联函数,还用得着“内联”这个关键字吗?
内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的消耗更多

的内存空间。

以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。

0 0
原创粉丝点击