下面这段代码有啥错误?
#if ULONG_MAX == 0xFFFFFFFF
inline unsigned long byte_swap(unsigned long x) { return __builtin_bswap32(x); }
inline long byte_swap(long x) { return __builtin_bswap32(x); }
#else
inline unsigned long byte_swap(unsigned long x) { return __builtin_bswap64(x); }
inline long byte_swap(long x) { return __builtin_bswap64(x); }
#endif // ULONG_MAX
当 ULONG_MAX 未定义时,被判断为假!多么危险的一个陷阱!
增加以下验证即可查错:
#ifdef ULONG_MAX
# if ULONG_MAX != 0xFFFFFFFFul
# if ULONG_MAX != 0xFFFFFFFFFFFFFFFFul
# error "ULONG_MAX error" is ULONG_MAX
# endif
# endif
#else
# error "ULONG_MAX is not defined"
#endif
这个 bug 耗费了我两个小时! ......
最近在做一个I2C键盘的Linux驱动,参考了其他芯片的一些代码,其中陆续发现有些让人迷惑的东西,把我的迷惑及理解在这里加以记录:
1. i2c_driver结构体的probe成员的原型:
int (*probe)(struct i2c_client *, const struct i2c_device_id *);
即:probe函数被调用时会从上边传两个个参数下来,类型分别是i2c_client和i2c_device_id
在i2c_client->dev.platform_data成员里的内容就是i2c_board_info中你所填充的platfrom_data数据。
2. Probe函数只会在驱动加载时调用一次,之后就不会再调用,而如果设备支持open接口,则可能需要在open接口的实现中做大量的可重入处理,因为open接口可能被多次调用且可能被多线程同时调用。
3. 代码:
INIT_DELAYED_WORK(&kpad->work, sn7325_work);
实现的功能是将sn7325_work加入到工作队列中,但现在并不立即执行。
4. input_dev中的几个成员的意义如下:
input->keycodesize: 每一个键盘码的尺寸(字节数)。
input->keycodemax: keymap中包含多少个键盘码
input->keycode: 具体的键盘 ......
最近在做一个I2C键盘的Linux驱动,参考了其他芯片的一些代码,其中陆续发现有些让人迷惑的东西,把我的迷惑及理解在这里加以记录:
1. i2c_driver结构体的probe成员的原型:
int (*probe)(struct i2c_client *, const struct i2c_device_id *);
即:probe函数被调用时会从上边传两个个参数下来,类型分别是i2c_client和i2c_device_id
在i2c_client->dev.platform_data成员里的内容就是i2c_board_info中你所填充的platfrom_data数据。
2. Probe函数只会在驱动加载时调用一次,之后就不会再调用,而如果设备支持open接口,则可能需要在open接口的实现中做大量的可重入处理,因为open接口可能被多次调用且可能被多线程同时调用。
3. 代码:
INIT_DELAYED_WORK(&kpad->work, sn7325_work);
实现的功能是将sn7325_work加入到工作队列中,但现在并不立即执行。
4. input_dev中的几个成员的意义如下:
input->keycodesize: 每一个键盘码的尺寸(字节数)。
input->keycodemax: keymap中包含多少个键盘码
input->keycode: 具体的键盘 ......
数组赋值我总结一下吧也就三种,那char的来举例:
定义的时候直接赋值.
1:char a[20] = "Hello World!";
2: char a[20];
strcpy(a, "Hello World!");
3:char a[20] = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'};
常见错误赋值方式:
1:char a[20];
a = "Hello World!";
原因:首先定义了个长度为20的char数组,也就是在运行时候,在栈里面开辟20个连续的单元,a为着20个单元的首地址。
其次,再堆里面一个字符串"Hello World!",把这个字符串的地主赋值给了a,而a之前是连续20个单元的地址。所以这个时候混乱了,不能这么赋值的。 ......
C库函数
字符串函数
函数名
函数原型
功能
返回值
包含头文件
strcat
char *strcat(char *st1, char *str2)
把str2连接到str1后面
str1
string.h
strchr
char *strchr(char *str, int ch)
找出str指向的字符串中第一次出现字符串ch的位置
指向该位置的指针,未找到则返回空指针
string.h
strcmp
int strcmp(char *str1, char *str2)
比较两个字符串
str1 < str2 返回负数,= 返回 0, < 返回 正数
string.h
strcpy
char *strcpy(char *str1, char *str2)
把str2拷贝到str1中
str1
string.h
strlen
unsigned int strlen(char *str)
统计str中字符的个数
字符个数
string.h
strstr
char *strstr(char *str1, char *str2)
找出str2在str1中第一次出现的位置
指向该位置的指针,未找到则返回空指针
string.h
tolower
int tolower(int ch)
ch字符串转换为小写字母
与ch相应的小写字母
ctype.h
toupper
int toupper(int ch)
ch字符串转换为大写字母
与ch相应的大写字母
ctype.h
......
extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。让我们来详细解读这两重含义。
(1) 被extern "C"限定的函数或变量是extern类型的;
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。记住,下列语句:
extern int a;
仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数。
与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern “C”修饰。
......
C/C++ development with the Eclipse Platform
Pawel Leszek
摘要:通过本文你将获得如何在Eclipse平台上开发C/C++项目的总体认识。虽然Eclipse主要被用来开发Java项目,但它的框架使得它很容易实现对其他开发语言的支持。在这篇文章里,你将学会如何使用CDT(C/C++ Development Toolkit),一个在Eclipse平台上最适用的C/C++工具包。
C/C++语言是世界上最流行的程序开发语言,所以Eclipse提供对C/C++语言的支持也就不足为奇了。由于Eclipse只是为开发工具提供一个框架,所以它必须借助外部插件的形式实现对C/C++语言的间接支持。这篇文章告诉你如何使用CDT,一个用于Eclipse平台的C/C++开发的插件组。CDT项目(见本文后面的Resource部分)的目标是为Eclipse平台提供一个完全意义上的C/C++集成开发环境。虽然整个项目专注于Linux平台,但实际上,在那些提供了GNU开发工具的平台上,CDT都可以运行得很好,包括Win32(Win 95/98/Me/NT/2000/XP),QNX Neutrino和Solaris平台等。
CDT是一个开源项目(基于CPL),纯粹由Java语言实现。这些插件在Eclipse工作区中添加了一个C/C++开发视角,包括一系列的视图(Views)和向导(Wizards),以及一些高级的编辑和调试支持等, ......
C/C++ development with the Eclipse Platform
Pawel Leszek
摘要:通过本文你将获得如何在Eclipse平台上开发C/C++项目的总体认识。虽然Eclipse主要被用来开发Java项目,但它的框架使得它很容易实现对其他开发语言的支持。在这篇文章里,你将学会如何使用CDT(C/C++ Development Toolkit),一个在Eclipse平台上最适用的C/C++工具包。
C/C++语言是世界上最流行的程序开发语言,所以Eclipse提供对C/C++语言的支持也就不足为奇了。由于Eclipse只是为开发工具提供一个框架,所以它必须借助外部插件的形式实现对C/C++语言的间接支持。这篇文章告诉你如何使用CDT,一个用于Eclipse平台的C/C++开发的插件组。CDT项目(见本文后面的Resource部分)的目标是为Eclipse平台提供一个完全意义上的C/C++集成开发环境。虽然整个项目专注于Linux平台,但实际上,在那些提供了GNU开发工具的平台上,CDT都可以运行得很好,包括Win32(Win 95/98/Me/NT/2000/XP),QNX Neutrino和Solaris平台等。
CDT是一个开源项目(基于CPL),纯粹由Java语言实现。这些插件在Eclipse工作区中添加了一个C/C++开发视角,包括一系列的视图(Views)和向导(Wizards),以及一些高级的编辑和调试支持等, ......