一直想写一些比较C和C++设计与编程风格的文字,正好近来工作任务不多,能够有时间重新整理一下自己所学的东东,于是便决定开始写这个题目,而目的仅仅只是打算能就这个话题和大家讨论讨论,抛砖引玉、增长个人的见识。
首先想说明一下,个人是C++设计、编程风格的坚定拥护者,所以我的观点难免带有个人的偏好,如果您不赞同,也请批评指正。好了,言归正传,个人觉得C与C++设计与编程风格最本质的不同是:C以函数间的调用关系为核心(所以C语言被称为面向过程式语言),而C++以程序元素(对象)间的关系和结构为核心(所以C++被称为面向对象的语言)——PS:如果您拿到一堆代码后首先去看各个函数的实现,并试图弄懂它们是如何相互调用的,那证明您是一位典型的C程序员;而如果您首先是去查看所有头文件,并试图搞懂每个类之间的关系,那证明您是一位典型的C++程序员。
举个简单的例子,对于一名C程序员,当他需要实现某种状态机时,通常是使用下面这样的代码:
if (0 == CheckState(...) ) // 判断某个函数的返回值是否为0
DoSomething(...); // 调用某个函数
else
DoSomethingElse(...); // 调用处理其它情况的另一个函数
或 ......
一直想写一些比较C和C++设计与编程风格的文字,正好近来工作任务不多,能够有时间重新整理一下自己所学的东东,于是便决定开始写这个题目,而目的仅仅只是打算能就这个话题和大家讨论讨论,抛砖引玉、增长个人的见识。
首先想说明一下,个人是C++设计、编程风格的坚定拥护者,所以我的观点难免带有个人的偏好,如果您不赞同,也请批评指正。好了,言归正传,个人觉得C与C++设计与编程风格最本质的不同是:C以函数间的调用关系为核心(所以C语言被称为面向过程式语言),而C++以程序元素(对象)间的关系和结构为核心(所以C++被称为面向对象的语言)——PS:如果您拿到一堆代码后首先去看各个函数的实现,并试图弄懂它们是如何相互调用的,那证明您是一位典型的C程序员;而如果您首先是去查看所有头文件,并试图搞懂每个类之间的关系,那证明您是一位典型的C++程序员。
举个简单的例子,对于一名C程序员,当他需要实现某种状态机时,通常是使用下面这样的代码:
if (0 == CheckState(...) ) // 判断某个函数的返回值是否为0
DoSomething(...); // 调用某个函数
else
DoSomethingElse(...); // 调用处理其它情况的另一个函数
或 ......
1.概述
许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1) 对函数返回的限定
;
(2) 对函数参数的限定
。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float ......
1.概述
许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1) 对函数返回的限定
;
(2) 对函数参数的限定
。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float ......
void myprintf(const char *format, ...)
{
va_list arglist;
va_start(arglist, format);
vprintf(format, arglist); // or some other operation
va_end(arglist);
}
NAME
printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - formatted output conversion
SYNOPSIS
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
#include <stdarg.h>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
& ......
linux下面串口工具C-kermit C-kermit是一款集成了网络通信、串口通信的工具,它有如下多种功能
1.支持kermit文件传输协议
2.自定义了一种脚本语言,它强大而易于使用,可用于自动化工作
3.无论是网络通信,还是串口通信,操作是一致的,并支持多种硬件、软件平台
4.有安全认证、加密功能
5.内建FTP、HTTP客户端功能及ssh接口
6.支持字符集转换
介绍在ubuntu8.0.4下安装、使用c-kermit的方法
确保ubuntu能连接上网络,使用一下命令就安装,
sudo apt-get install ckermit
使用kermit之前,在用户宿主目录下创建一个名为.kermrc的配置文件,内容如下
set line /dev/ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
然后在终端里运行 sudo kermit -c 命令启动串口;关闭串口,先同时按住“ctrl”和“”键,然后松开再按“c”键,最后输入“exit”并回车 ......
linux下面串口工具C-kermit C-kermit是一款集成了网络通信、串口通信的工具,它有如下多种功能
1.支持kermit文件传输协议
2.自定义了一种脚本语言,它强大而易于使用,可用于自动化工作
3.无论是网络通信,还是串口通信,操作是一致的,并支持多种硬件、软件平台
4.有安全认证、加密功能
5.内建FTP、HTTP客户端功能及ssh接口
6.支持字符集转换
介绍在ubuntu8.0.4下安装、使用c-kermit的方法
确保ubuntu能连接上网络,使用一下命令就安装,
sudo apt-get install ckermit
使用kermit之前,在用户宿主目录下创建一个名为.kermrc的配置文件,内容如下
set line /dev/ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
然后在终端里运行 sudo kermit -c 命令启动串口;关闭串口,先同时按住“ctrl”和“”键,然后松开再按“c”键,最后输入“exit”并回车 ......
动态加载DLL需要使用Windows API函数:LoadLibrary、GetProcAddress以及FreeLibrary。我们可以使用DllImport在C#中使用这三个函数。
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("Kernel32")]
public static extern int LoadLibrary(String funcname);
[DllImport("Kernel32")]
public static extern int FreeLibrary(int handle);
当我们在C++中动态调用Dll中的函数时,我们一般的方法是:
假设DLL中有一个导出函数,函数原型如下:
BOOL __stdcall foo(Object &object, LPVOID lpReserved);
1、首先定义相应的函数指针:
typedef BOOL (__stdcall *PFOO)(Object &object, LPVOID lpReserved);
2、调用LoadLibrary加载dll:
HINSTANCE hInst = ::LoadLibraryW(dllFileName);
3、调用GetProcAddress函数获取要调用函数的地址:
PFOO foo = (PFOO)GetProcAddress(hInst,"foo");
if(foo == NULL)
{
FreeLibrary(hInst);
return false;
}
4、调用foo函数:
BOOL bRe ......
动态加载DLL需要使用Windows API函数:LoadLibrary、GetProcAddress以及FreeLibrary。我们可以使用DllImport在C#中使用这三个函数。
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("Kernel32")]
public static extern int LoadLibrary(String funcname);
[DllImport("Kernel32")]
public static extern int FreeLibrary(int handle);
当我们在C++中动态调用Dll中的函数时,我们一般的方法是:
假设DLL中有一个导出函数,函数原型如下:
BOOL __stdcall foo(Object &object, LPVOID lpReserved);
1、首先定义相应的函数指针:
typedef BOOL (__stdcall *PFOO)(Object &object, LPVOID lpReserved);
2、调用LoadLibrary加载dll:
HINSTANCE hInst = ::LoadLibraryW(dllFileName);
3、调用GetProcAddress函数获取要调用函数的地址:
PFOO foo = (PFOO)GetProcAddress(hInst,"foo");
if(foo == NULL)
{
FreeLibrary(hInst);
return false;
}
4、调用foo函数:
BOOL bRe ......
动态加载DLL需要使用Windows API函数:LoadLibrary、GetProcAddress以及FreeLibrary。我们可以使用DllImport在C#中使用这三个函数。
[DllImport("Kernel32")]
public static extern int GetProcAddress(int handle, String funcname);
[DllImport("Kernel32")]
public static extern int LoadLibrary(String funcname);
[DllImport("Kernel32")]
public static extern int FreeLibrary(int handle);
当我们在C++中动态调用Dll中的函数时,我们一般的方法是:
假设DLL中有一个导出函数,函数原型如下:
BOOL __stdcall foo(Object &object, LPVOID lpReserved);
1、首先定义相应的函数指针:
typedef BOOL (__stdcall *PFOO)(Object &object, LPVOID lpReserved);
2、调用LoadLibrary加载dll:
HINSTANCE hInst = ::LoadLibraryW(dllFileName);
3、调用GetProcAddress函数获取要调用函数的地址:
PFOO foo = (PFOO)GetProcAddress(hInst,"foo");
if(foo == NULL)
{
FreeLibrary(hInst);
return false;
}
4、调用foo函数:
BOOL bRe ......
1 创建C# DLL,需要指定应用类型为“类库”,代码:
namespace CSLib
{
public class Class1
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = "Your Name: " + value;
}
&nb ......
1 创建C# DLL,需要指定应用类型为“类库”,代码:
namespace CSLib
{
public class Class1
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = "Your Name: " + value;
}
&nb ......
1 创建C# DLL,需要指定应用类型为“类库”,代码:
namespace CSLib
{
public class Class1
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = "Your Name: " + value;
}
&nb ......