extern是C/C++语言中表明函数和全局变量作用范围(可见性).
它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误
2。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。也就是说c文件里面定义,如果该函数或者变量与开放给外面,则在h文件中用extern加以声明。所以外部文件只用include该h文件就可以了。而且编译阶段,外面是找不到该函数的,但是不报错。link阶段会从定义模块生成的目标代码中找到此函数。
3。与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。
被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;
未加extern “C”声明时的编译方式
首先看看C++中对类似C的函数是怎样编译的。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为: void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo ......
第二章 征服可测性难题
2.1 可测性问题详解(1)
单元测试效益特别高,方法也很简单,但却尝试的企业很多,成功实施的企业很少,为什么呢?主要原因就是难于突破可测性问题。“可测”这个词,意思已经很明白了,如果不“可测”的话,那就是不能测,没法测,就是做不下去,或者困难太多,成本太重,热情被逐渐消磨,最后做不下去。所以可测性问题是单元测试的关键,是我们首先要解决的。
可测性问题是指代码的可测性很差,导致测试很困难,这是单元测试的关键阻碍。为什么代码的可测性会很差呢?原因是什么?一般来说,这些原因导致了代码的可测性差:项目很复杂,开发流程不规范,耦合度很高。耦合是指代码之间的互相依赖,例如一个函数调用另一个函数,就是耦合。
一般的建议是改进开发流程,提高代码可测性。但从实践来看,这是不现实的。可测性差在企业项目中普遍存在,有其客观原因,很难改变。首先,企业项目本身就多是很复杂的,这是需求决定的,改不了。其次,程序并不是虚无的,程序 ......
第二章 征服可测性难题
2.1 可测性问题详解(1)
单元测试效益特别高,方法也很简单,但却尝试的企业很多,成功实施的企业很少,为什么呢?主要原因就是难于突破可测性问题。“可测”这个词,意思已经很明白了,如果不“可测”的话,那就是不能测,没法测,就是做不下去,或者困难太多,成本太重,热情被逐渐消磨,最后做不下去。所以可测性问题是单元测试的关键,是我们首先要解决的。
可测性问题是指代码的可测性很差,导致测试很困难,这是单元测试的关键阻碍。为什么代码的可测性会很差呢?原因是什么?一般来说,这些原因导致了代码的可测性差:项目很复杂,开发流程不规范,耦合度很高。耦合是指代码之间的互相依赖,例如一个函数调用另一个函数,就是耦合。
一般的建议是改进开发流程,提高代码可测性。但从实践来看,这是不现实的。可测性差在企业项目中普遍存在,有其客观原因,很难改变。首先,企业项目本身就多是很复杂的,这是需求决定的,改不了。其次,程序并不是虚无的,程序 ......
Eclipse CDT MinGw Astyle
1、Java JDK的安装
Eclipse是一款跨平台的工具,只需要基本的java虚拟机就可以运行。
安装Java SDK很简单。到http://java.sun.com上找到适合你的操作系统的Java JDK安装程序,下载之并运行,Java SDK就会安装到你的系统中。
注意,更高版本的Eclipse需要更高版本的Java JDK。
2、Eclipse及CDT的安装
到Eclipse的官方网站http://www.eclipse.org上下载Eclipse。
安装CDT。CDT的全称是C/C++ Development Tools,是使Eclipse能够支持C/C++开发的插件。进入CDT的官方网站,http://www/eclipse.org/cdt,然后选择一个镜像站点分别下载CDT。下载完成后,将这两个压缩包解压到Eclipse的目录中。
(也可以在安装完Eclipse后,通过Eclipse的软件更新功能安装CDT,具体步骤可以参考Eclipse的在线文档。)
3、安装MinGW
现在这个C/C++ IDE还不能开动,因为缺少了重要的部件。这个部件就是C/C++的编译器。在Windows OS下我们可以选择MinGW。到MinGW的网站http://mingw.sourceforge.net上,下载MinGW,安装。为了以后方便使用,创建一个批处理文件:
安装后,要配置系统环境变量
右键我的电脑->属性->高级->环境变量->系统变量中添加
......
Eclipse CDT MinGw Astyle
1、Java JDK的安装
Eclipse是一款跨平台的工具,只需要基本的java虚拟机就可以运行。
安装Java SDK很简单。到http://java.sun.com上找到适合你的操作系统的Java JDK安装程序,下载之并运行,Java SDK就会安装到你的系统中。
注意,更高版本的Eclipse需要更高版本的Java JDK。
2、Eclipse及CDT的安装
到Eclipse的官方网站http://www.eclipse.org上下载Eclipse。
安装CDT。CDT的全称是C/C++ Development Tools,是使Eclipse能够支持C/C++开发的插件。进入CDT的官方网站,http://www/eclipse.org/cdt,然后选择一个镜像站点分别下载CDT。下载完成后,将这两个压缩包解压到Eclipse的目录中。
(也可以在安装完Eclipse后,通过Eclipse的软件更新功能安装CDT,具体步骤可以参考Eclipse的在线文档。)
3、安装MinGW
现在这个C/C++ IDE还不能开动,因为缺少了重要的部件。这个部件就是C/C++的编译器。在Windows OS下我们可以选择MinGW。到MinGW的网站http://mingw.sourceforge.net上,下载MinGW,安装。为了以后方便使用,创建一个批处理文件:
安装后,要配置系统环境变量
右键我的电脑->属性->高级->环境变量->系统变量中添加
......
最近在研究操作系统,《自己动手写操作系统》上第5章讲了asm和c函数之间互调用,目的是使用c来写操作系统内核的代码,毕竟用汇编写代码还是很费时间的事。
配置Linux开发环境实在是太麻烦,要装虚拟机,还要配置老半天。于是就想能都在windows环境下实现互调用,很自然的想到了mingw交叉环境。于是下了一个win32版本的nasm编译器,用nasm编译汇编,用gcc编译c,查了一下nasm的编译选项-f可以指定asm文件的目标格式,估计可行,但考虑到mingw是交叉环境,感觉上还是用cl.exe来编c文件比较好,反正nasm也支持导出win32格式的obj文件。试了一下可行,现将代码贴上来。一共三个文件:bar.c, foo.asm, makefile.内容如下:
1. bar.c
#include <stdio.h>
void myprint(); // 函数声明
int choose(int a, int b)
{
int c;
// __asm int 3; // 加断点会进入VS调试器
__asm{ // 内嵌汇编测试,等价于:c = b + 1;
mov eax, dword ptr [b]
inc eax
mov dword ptr [c], eax
}
printf("a = %d, b = %d, c = %d.\n", a, b, c); // 输出:a = 3, b = 4, c = 5.
myprint(); // ......
Include head file time.h, though it's a C include file, C++ certainly can use it.
Under C++, you can include <ctime> instead of <time.h>
_____________________________________________________
time.h
@函数名称: localtime
函数原型: struct tm *localtime(const time_t *timer)
函数功能: 返回一个以tm结构表达的机器时间信息
函数返回: 以tm结构表达的时间,结构tm定义如下:
struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
参数说明: timer-使用time()函数获得的机器时间
所属文件: <time.h>
#include <time.h>
#include <stdio.h>
#include <dos.h>
int main()
{
time_t timer;
struct tm *tblock;
timer=time(NULL);
tblock=localtime(&timer);
printf("Local time is: %s",asctime(tblock));
return 0;
}
@函数名称: asctime
函数原型: char* asctime(struct tm * ptr)
函数功能: 得到机器时间(日期时间转换为ASCII码)
函数返回: 返回的时间字符串 ......
Include head file time.h, though it's a C include file, C++ certainly can use it.
Under C++, you can include <ctime> instead of <time.h>
_____________________________________________________
time.h
@函数名称: localtime
函数原型: struct tm *localtime(const time_t *timer)
函数功能: 返回一个以tm结构表达的机器时间信息
函数返回: 以tm结构表达的时间,结构tm定义如下:
struct tm{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
参数说明: timer-使用time()函数获得的机器时间
所属文件: <time.h>
#include <time.h>
#include <stdio.h>
#include <dos.h>
int main()
{
time_t timer;
struct tm *tblock;
timer=time(NULL);
tblock=localtime(&timer);
printf("Local time is: %s",asctime(tblock));
return 0;
}
@函数名称: asctime
函数原型: char* asctime(struct tm * ptr)
函数功能: 得到机器时间(日期时间转换为ASCII码)
函数返回: 返回的时间字符串 ......
无意发现在网上很刚学C#的朋友们都在找关于C#如何递归实现TreeView的绑定,见网上很多例子都比较深奥,我特意写了个比较简单易懂的例子帮助大家了解C#TreeView的操作与递归的实现...
本文只是用递归的方式简单实现TreeView的操作,可能存在性能上的问题,仅供初学者参考。
效果图:
一:创建数据库和数据表(Area)
二:创建AreaManage项目:
项目结构:
以下是各个类文件的代码:
1.SQLOperate.cs
/// <summary>
///SQLOperate 的摘要说明
/// </summary>
public class SQLOperate
{
/// <summary>
/// 根据parentId查地区信息
/// </summary>
/// <param name="parentId"></param>
/// <returns></returns>
public static DataTable GetAreaInfoByParentId(int parentId)
{
string sql = "select * from Area where ParentId = @ParentId";
SqlParameter[] para = new SqlParameter[]
{
new SqlParameter("@ParentId",parentId)
};
return DBHelper.GetDataSet(sql, para);
}
/// <summary&g ......