- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C 语言常用方法技巧由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C语言常用方法技巧 。
除法向上取整 。
#define DIV_ROUND_UP(n, d) (((n)+(d)-1) / (d)) 。
大端小端选择 。
low-endian or high-endian 。
1
2
3
4
5
6
7
8
9
10
|
typedef
union
{
short
W;
/* Word access */
struct
{
/* Byte access */
#ifdef LOW_ENDIAN
byte low, high;
/* in low-endian arch */
#else
byte high, low;
/* in high-endian arch */
#endif
} B;
} word;
|
求余数运算 。
1
2
3
|
a = a % 8;
=>
a = a & 7;
|
说明:位运算只需一个指令周期;取余通常需要调用子程序.
平方运算 。
1
2
3
|
a =
pow
(a, 2.0);
=>
a = a * a;
|
说明:内置乘法运算器的处理器中,乘法运算比求平方运算更快;即使没有内置乘法运算器,乘法运算的子程序也比平方运算子程序效率高.
移位实现乘除法运算 。
1
2
3
4
5
|
a = a * 4;
b = b / 4;
=>
a = a << 2;
b = b >> 2;
|
说明:通常乘以或者除以2n,可使用移位方法代替.
1
2
3
|
a = a * 9;
=>
a = (a << 3) + a;
|
while 循环和 do...while 循环 。
说明:do...while 循环编译后生成的代码长度短于 while 循环.
重定义类型,扩展移植性 。
1
2
3
4
5
6
7
|
typedef
unsigned
char
boolean;
/* Boolean value type. */
typedef
unsigned
long
int
uint32;
/* Unsigned 32 bit value */
typedef
unsigned
short
uint16;
/* Unsigned 16 bit value */
typedef
unsigned
char
uint8;
/* Unsigned 8 bit value */
typedef
signed
long
int
int32;
/* Signed 32 bit value */
typedef
signed
short
int16;
/* Signed 16 bit value */
typedef
signed
char
int8;
/* Signed 8 bit value */
|
得到指定地址上的一个字节或字 。
1
2
3
4
5
|
typedef
unsigned
char
byte;
/* Unsigned 8 bit value type */
typedef
unsigned
short
word;
/* Unsigned 16 bit value type */
#define MEM_B(x) (*((byte*)(x)))
#define MEM_W(x) (*((word*)(x)))
|
求取极值 。
1
2
|
#define MAX(x, y) ((x) > (y) ? (x) : (y))
#define MIN(x, y) ((x) < (y) ? (x) : (y))
|
得到一个 field 在结构体(struct)中的偏移量 。
1
2
3
4
|
typedef
unsigned
long
dword;
/* Unsigned 32 bit value type */
#define FPOS(type, field)\
( (dword)&((type*)0)->field )
|
得到一个结构体中 field 所占用的字节数 。
1
2
|
#define FSIZE(type, field)\
(
sizeof
(((type*)0)->field) )
|
按照 LSB 格式把一个 word(16 bit) 转换成两个字节 。
1
2
3
4
5
|
#define FLOPW(ray, val)\
do
{\
(ray)[0] = ((val)>>8);\
(ray)[1] = ((val)&0xFF);\
}
while
(0);
|
得到一个变量的地址 。
1
2
3
4
5
|
typedef
unsigned
char
byte;
/* Unsigned 8 bit value type */
typedef
unsigned
short
word;
/* Unsigned 16 bit value type */
#define B_PTR(var) ((byte*)(void*)&(var))
#define W_PTR(var) ((word*)(void*)&(var))
|
得到一个字节的低位和高位 。
1
2
3
4
5
|
typedef
unsigned
char
byte;
/* Unsigned 8 bit value type */
typedef
unsigned
short
word;
/* Unsigned 16 bit value type */
#define WORD_L(var) ((byte)(word)(var)&(0xFF))
#define WORD_H(var) ((byte)(word)(var)>>(8))
|
返回一个比 X 大的接近 8 的倍数 。
#define RND8(x) ((((x) + 7) >> 3) << 3) 。
防止溢出的方法 。
1
2
|
#define INC_SAT(val)\
((val) = ( ((val) + 1) > (val)) ? ((val) + 1):(val) )
|
返回数组元素的个数 。
1
2
|
#define ARR_SIZE(a)\
( (
sizeof
(a)) / (
sizeof
(a[0])) )
|
返回一个无符号数的后 n 位数 。
1
2
3
4
|
typedef
unsigned
long
dword;
/* Unsigned 32 bit value type */
#define MOD_BY_POWER_OF_TWO(val, mod_by)\
((dword)(val)&(dword)(2<<(mod_by) - 1))
|
IO 空间映射在存储空间中的结构 。
1
2
3
4
5
6
7
8
9
10
11
|
typedef
unsigned
char
byte;
/* Unsigned 8 bit value type */
typedef
unsigned
short
word;
/* Unsigned 16 bit value type */
typedef
unsigned
long
dword;
/* Unsigned 32 bit value type */
#define outp(port) (*((volatile byte *)(port)))
#define outpw(port) (*((volatile word *)(port)))
#define outpdw(port) (*((volatile dword *)(port)))
#define inp(port, val) (*((volatile byte *)(port))) = (byte)(val)
#define inpw(port, val) (*((volatile word *)(port))) = (word)(val)
#define inpdw(port, val) (*((volatile dword *)(port))) = (dword)(val)
|
宏中 "#" 和 "##" 的用法 。
1、使用 "#" 把宏参数变为一个字符串, 用 "##" 把两个宏参数贴合在一起.
1
2
3
4
5
|
#define STR(val) (#val)
#define CONS(a, b) (int)(a##e##b)
->
STR(hello) ==>
"hello"
CONS(2, 3) ==> 2000
// 2e3
|
2、当宏参数是另一个宏的时候 。
需要注意的是凡宏定义里有用 '#' 或 '##' 的地方宏参数是不会再展开. 。
1, 非 '#' 和 '##' 的情况 。
1
2
3
4
5
6
|
#define TOW (2)
#define MUL(a,b) (a*b)
printf
(
"%d*%d=%d\n"
, TOW, TOW, MUL(TOW,TOW));
==>
printf
(
"%d*%d=%d\n"
, (2), (2), ((2)*(2)));
|
MUL里的参数TOW会被展开为(2).
2, 当有 '#' 或 '##' 的时候 。
1
2
3
4
5
6
7
8
9
10
11
|
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
printf
(
"int max: %s\n"
, STR(INT_MAX));
// INT_MAX #include
==>
printf
(
"int max: %s\n"
,
"INT_MAX"
);
printf
(
"%s\n"
, CONS(A, A));
// compile error
==>
printf
(
"%s\n"
,
int
(AeA));
|
INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单,加多一层中间转换宏,加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数. 。
1
2
3
4
5
6
7
|
#define A (2)
#define _STR(s) (#s)
#define STR(s) _STR(s) // 转换宏
#define _CONS(a,b) int(a##e##b)
#define CONS(a,b) _CONS(a,b) // 转换宏
printf
(
"int max: %s\n"
, STR(INT_MAX));
// INT_MAX,int型的最大值,为一个变量 #include
|
输出为: int max: 0x7fffffff 。
1
2
|
STR(INT_MAX) --> _STR(0x7fffffff) 然后再转换成字符串;
printf
(
"%d\n"
, CONS(A, A));
|
输出为:200 。
CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2)) 。
3、'#' 和 '##' 的一些应用特例 。
1、合并匿名变量名 。
1
2
3
|
#define ___ANONYMOUS1(type, var, line) type var##line
#define __ANONYMOUS0(type, line) ___ANONYMOUS1(type, _anonymous, line)
#define ANONYMOUS(type) __ANONYMOUS0(type, __LINE__)
|
例:ANONYMOUS(static int),
即: static int _anonymous70; 70表示该行行号,
第一层:ANONYMOUS(static int); --> __ANONYMOUS0(static int, __LINE__),
第二层: --> ___ANONYMOUS1(static int, _anonymous, 70),
第三层: --> static int _anonymous70,
即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开,
2、填充结构 。
1
2
3
4
5
6
7
8
9
10
11
12
|
#define FILL(a) {a, #a}
enum
IDD {OPEN, CLOSE};
typedef
struct
MSG{
IDD id;
const
char
* msg;
}MSG;
MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
==>
MSG _msg[] = {{OPEN,
"OPEN"
},
{CLOSE,
"CLOSE"
}};
|
3、记录文件名 。
1
2
3
4
|
#define _GET_FILE_NAME(f) #f
#define GET_FILE_NAME(f) _GET_FILE_NAME(f)
static
char
FILE_NAME[] = GET_FILE_NAME(__FILE__);
|
4、得到一个数值类型所对应的字符串缓冲大小 。
1
2
3
4
5
6
|
#define _TYPE_BUF_SIZE(type) sizeof #type
#define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type)
char
buf[TYPE_BUF_SIZE(INT_MAX)];
-->
char
buf[_TYPE_BUF_SIZE(0x7fffffff)];
-->
char
buf[
sizeof
"0x7fffffff"
];
|
这里相当于: char buf[11],
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我! 。
原文链接:http://www.cnblogs.com/openxyz/p/6616142.html 。
最后此篇关于C 语言常用方法技巧的文章就讲到这里了,如果你想了解更多关于C 语言常用方法技巧的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!