2013年03月13日
#ifdef WIN32 //WIN32为全局宏定义,使用VS编译器会自动加此宏开关
#ifdef UOML_API_EXPORTS //如果程序前部有定义此宏开关,则编译以下语句
#define UOML_API __declspec (dllexport) //将UOML_API定义成DLL输出函数
#else //如果程序前部未定义UOML_API_EXPORTS宏开关,则编译以下语句
#define UOML_API //将 UOML_API 定义成空
====================
__declspec(dllexport) & __declspec(dllimport)
__declspec(dllexport) 声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中 省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类 __declspec(dllimport) 声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中 不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。 使用举例: // File: SimpleDLLClass.h #ifdef SIMPLEDLL_EXPORT #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT #endif class DLL_EXPORT SimpleDLLClass { public: SimpleDLLClass(); virtual ~SimpleDLLClass(); virtual getValue() { return m_nValue;}; private: int m_nValue; }; // File: SimpleDLLClass.cpp #include "SimpleDLLClass.h" SimpleDLLClass::SimpleDLLClass() { m_nValue=0; } SimpleDLLClass::~SimpleDLLClass() { } 说明: 1. 在你的APP中include SimpleDLLClass.h时,如果你的APP的项目不定义SIMPLEDLL_EXPORT,则DLL_EXPORT不存在。此时APP仍可以正常运行。 // File: SimpleDLLClass.h static int m_nValue; // File: SimpleDLLClass.cpp int SimpleDLLClass::m_nValue=0; 说明: 1. 如果你的APP的项目不定义SIMPLEDLL_EXPORT,则DLL_EXPORT不存在。此时APP无法LINK。原因是找不到m_nValue。(原因:静态变量m_nValue已被DLL导出,但SimpleDLLClass无法访问m_nValue) Workaround: #define DLL_EXPORT __declspec(dllimport) Conclusion: dllimport是为了更好的处理类中的静态成员变量(或者其他...)的,如果没有静态成员变量(或者其他...),那么这个__declspec(dllimport)无所谓. ///////////////////////// 在Windows DLL编程时,可使用__declspec(dllimport)关键字导入函数或者变量。
函数的导入
当你需要使用DLL中的函数时,往往不需要显示地导入函数,编译器可自动完成。但如果你显示地导入函数,编译器会产生质量更好的代码。由于编译器确切地知道了一个函数是否在一个DLL中,它就可以产生更好的代码,不再需要间接的调用转接。
Win32的PE格式(Portable Executable Format)把所有导入地址放在一个导入地址表中。下面用一个具体实例说明使用__declspec(dllimport)导入函数和不使用的区别:
假设func是一个DLL中的函数,现在在要生成的.exe的main函数中调用func函数,并且不显示地导入func函数(即没有:__declspec(dllimport)),代码示例如下:
int main()
{
func();
}
编译器将产生类似这样的调用代码:
call func
然后,链接器把该调用翻译为类似这样的代码:
call 0x40000001       ; ox40000001是"func"的地址
并且,链接器将产生一个Thunk,形如:
0x40000001: jmp DWORD PTR __imp_func
这里的imp_func是func函数在.exe的导入地址表中的函数槽的地址。然后,加载器只需要在加载时更新.exe的导入地址表即可。
而如果使用了__declspec(dllimport)显示地导入函数,那么链接器就不会产生Thunk(如果不被要求的话),而直接产生一个间接调用。因此,下面的代码:
__declspec(dllimport) void func1(void); void main(void) { func1(); }
将调用如下调用指令:
call DWORD PTR __imp_func1
因此,显示地导入函数能有效减少目标代码(因为不产生Thunk)。另外,在DLL中使用DLL外的函数也可以这样做,从而提高空间和时间效率。
变量的导入
与函数不同的是,在使用DLL中的变量时,需要显示地导入变量。使用__declspec(dllimport)关键字导入变量。若在DLL中使 用.def导出变量,则应使用DATA修饰变量,而不是使用已经被遗弃的CONSTANT。因为CONSTANT可能需要使用指针间接访问变量,不确定什 么时候会出问题。
//////////////
我相信写WIN32程序的人,做过DLL,都会很清楚__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导 出哪些 函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出 类。但是,MSDN文档里面,对于__declspec(dllimport)的说明让人感觉有点奇怪,先来看看MSDN里面是怎么说的: 不使 用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于 DLL 中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨 DLL 边界的函数调用中。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。 初看起来,这段话前面的意思是,不用它也可以正常使用DLL的导出库,但最后一句话又说,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量这个是什么意思?? 那我就来试验一下,假定,你在DLL里只导出一个简单的类,注意,我假定你已经在项目属性中定义了 SIMPLEDLL_EXPORT SimpleDLLClass.h #ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT#endifclass DLL_EXPORT SimpleDLLClass{public: SimpleDLLClass(); virtual ~SimpleDLLClass(); virtual getValue() { return m_nValue;};private: int m_nValue;};SimpleDLLClass.cpp #include "SimpleDLLClass.h"SimpleDLLClass::SimpleDLLClass() { m_nValue=0;}SimpleDLLClass::~SimpleDLLClass(){}然后你再使用这个DLL类,在你的APP中 include SimpleDLLClass.h时,你的APP的项目不用定义 SIMPLEDLL_EXPORT 所以,DLL_EXPORT 就不会存在了,这个时候,你在APP中,不会遇到问题。这正好对应MSDN上说的__declspec(dllimport)定义与否都可以正常使用。但 我们也没有遇到变量不能正常使用呀。 那好,我们改一下SimpleDLLClass,把它的m_nValue改成static,然后在cpp文件中加一行 int SimpleDLLClass::m_nValue=0;如果你不知道为什么要加这一行,那就回去看看C++的基础。 改完之后,再去LINK一下,你的APP,看结果如何, 结果是LINK告诉你找不到这个m_nValue。明明已经定义了,为什么又没有了?? 肯定是因为我把m_nValue定义为static的原因。但如果我一定要使用Singleton的Design Pattern的话,那这个类肯定是要有一个静态成员,每次LINK都没有,那不是完了? 如果你有Platform SDK,用里面的Depend程序看一下,DLL中又的确是有这个m_nValue导出的呀。 再回去看看我引用MSDN的那段话的最后一句。 那我们再改一下SimpleDLLClass.h,把那段改成下面的样子: #ifdef SIMPLEDLL_EXPORT#define DLL_EXPORT __declspec(dllexport)#else#define DLL_EXPORT __declspec(dllimport)#endif再LINK,一切正常。原来dllimport是为了更好的处理类中的静态成员变量的,如果没有 静态成员变量,那么这个__declspec(dllimport)无所谓。 =========
declspec(dllexport)是用于避免需要自己写DEF文件的。如果你在其他模块中包_declspec(dllexport)的头文件,这些项目的导出表中也会生成一个同名导出函数。
把他定义成一个宏,是为了还有一句.
#define DECLSPEC_IMPORT __declspec(dllexport)
这两句话放在一起,使用条件编译就可以实现一个头文件在编程者与调用者之间的共用了

====
下面的代码示例显示如何使用 _declspec(dllimport) 将函数调用从 DLL 导入到应用程序中。假定 func1 是驻留在某个 DLL 中的函数,而此 DLL 与包含“主”函数的 .exe 文件是分开的。

不使用 __declspec(dllimport),给出此代码:

C/C++ code?
1
2
3
4
int main(void)
{
func1();
}

编译器生成类似下面的代码:

C/C++ code?
1
call func1

call func1

链接器将调用翻译成下面的内容:

C/C++ code?
1
call 0x4000000         ; The address of 'func1'.

如果 func1 存在于另一个 DLL 中,链接器将无法直接解析此函数,因为它无法得知 func1 的地址。在 16 位环境中,链接器将此代码地 址添加到 .exe 文件中的某个列表中,而加载程序在运行时会用正确的地址修补该列表。在 32 位和 64 位环境中,链接器可生成一个知道其地址 的 thunk。在 32 位环境中,thunk 类似如下所示:

C/C++ code?
1
0x40000000:    jmp DWORD PTR __imp_func1

其中,imp_func1 是 func1 的槽在 .exe 文件的导入地址表中的地址。这样,链接器就知道了所有的地址。加载程序只需在加载时更新 .exe 文件的导入地址表,一切就会正常进行。

因此,使用 __declspec(dllimport) 更好,因为链接器不生成不必要的 thunk。thunk 使代码变大(在 RISC 系统上代码它可能是若干指令),并且会降低缓存性能。如果通知编译器函数在 DLL 中,编译器会为您生成间接调用。

因此,现在此代码:

C/C++ code?
1
2
3
4
5
__declspec(dllimport) void func1(void);
int main(void)
{
func1();
}

生成此指令:

C/C++ code?
1
call DWORD PTR __imp_func1

没有 thunk 和 jmp 指令,所以代码更小且更快。

另一方面,对于 DLL 内部的函数调用,您希望不必使用间接调用。您已经知道函数的地址。由于间接调用前需要时间和空间来加载和存储函数的地址,因此直 接调用总是更快,而且所需的空间也总是更小。当从 DLL 本身外部调用 DLL 时,您仅希望使用 __declspec(dllimport)。生成 某个 DLL 时不要对该 DLL 的内部函数使用 __declspec(dllimport)。

=========

在导入符号的时候,不必使用_declspec(dllimport)关键字,而可以直接使用标准C语言的extern关键字。但是,如果编译器能够提前 知道我们引用的符号是从一个DLL的.LIB文件中导入的,那么他能产生略微高效的代码。有鉴于此,建议读者再导入函数和数据符号的时候使用 _declspec(dllimport)关键字,那么Microsfot已经替我们准备好了

1、变量需要显示地导入。
2、如果不使用 __declspec(dllimport),那么编译生成的代码最终会类似:
call 0xXXXXXXXX
0xXXXXXXXX:  jmp dword ptr __imp_function
而如果使用了dllimport,连接器会直接生成如下代码,省去中间的间接调用:
call dword ptr __imp_func
3、在网上看到如果类中用了static变量,也需要使用dllimport。

其实就是这么个情况。

隐式使用dll时,不加__declspec(dllimport)完全可以,使用上没什么区别,只是在生成的二进制代码上稍微有点效率损失。

1、不加__declspec(dllimport)时,在使用dll中的函数时,编译器并不能区别这是个普通函数,还是从其它dll里导入的函数,所以其生成的代码如下:

call 地址1

地址1:
jmp  实际函数地址

2、有__declspec(dllimport)时,编译器知道这是要从外部dll导入的函数,从而在生成的exe的输入表里留有该项,以便在运行exe,PE载入器加载exe时对输入地址表IAT进行填写,这样生成的代码如下:

call dword ptr[输入表里哪项对应的内存地址] (注意:现在就不需要jmp stub了)

—====

PACKAGE是一个宏, 原型是:__declspec(package)

这个package参数表明代码定义的类可以在包中进行编译. 和全局变量没有什么关系.

所以, 你定义全局变量时, 只需在相应的头文件中用extern声明, 在相应的单元文件中定义就可以了. 无需PACKAGE参数.

另外, IDE自动生成的代码中的PACKAGE都可以去掉的, 并不影响编译.

extern PACKAGE TForm1 *Form1;
改成
extern TForm1 *Form1;
一样可以使用.

原文链接:http://hi.baidu.com/baiyw920/blog/item/a06ddb986314fd0f6e068c0c.html

__declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。其它的有关存储方式的修饰符如static与extern等是C和C++语言的ANSI规范,而__declspec是一种扩展属性的定义。扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展。

用法:__declspec ( extended-decl-modifier )

extended-decl-modifier参数如下,可同时出现,中间有空格隔开:

align (C++)

allocate

appdomain

deprecated (C++)

dllimport

dllexport

jitintrinsic

naked (C++)

noalias

noinline

noreturn

nothrow (C++)

novtable

process

property(C++)

restrict

selectany

thread

uuid(C++)

1.__declspec关键字应该出现在简单声明的前面。对于出现在*或&后面或者变量声明中标识符的前面的__declspec,编译器将忽略并且不给出警告。

2.要注意区分__declspec是修饰类型还是修饰变量:

__declspec(align(8)) struct Str b;修饰的是变量b。其它地方定义的struct Str类型的变量将不受__declspec(align(8))影响。

__declspec(align(8)) struct Str {};修饰的是struct Str类型。所有该类型的变量都受__declspec(align(8))影响。

align:

格式:__declspec(align(n)) declarator

其中,n是对齐参数,其有效值是的整数次幂(从到字节),如,,,,或。参数declarator是要设置对齐方式的数据。

1.使用__declspec(align(n))来精确控制用户自定义数据的对齐方式。你可以在定义struct,union,class或声明变量时使用__declspec(align(n))。

2.不能为函数参数使用__declspec(align(n))。

3.如果未使用__declspec(align(#)),编译器将根据数据大小按自然边界对齐。如字节整数按字节边界对齐;字节double按字节边界对齐。类或结构体中的数据,将取数据本身的自然对齐方式和#pragma pack(n)设置的对齐系数中的最小值进行对齐。

4.__declspec(align(n))和#pragma pack(n)是一对兄弟,前者规定了对齐系数的最小值,后者规定了对齐系数的最大值。

5.当两者同时出现时,前者拥有更高的优先级。即,当两者同时出现且值矛盾时,后者将不起作用。

6.当变量size大于等于#pragma pack(n)指定的n,而且__declspec(align(n))指定的数值n比对应类型长度小的时候,这个__declspec(align(n))指定将不起作用。

7.当#pragma pack(n)指定的值n大于等于所有数据成员size的时候,这个值n将不起作用。

allocate:

格式:__declspec(allocate(“segname”)) declarator

为数据指定存储的数据段。数据段名必须为以下列举中的一个:

code_seg

const_seg

data_seg

init_seg

section

appdomain:

指定托管程序中的每个应用程序域都要有一份指定全局变量或静态成员变量的拷贝。

deprecated:

与#pragma deprecated()的作用相同。用于指定函数的某个重载形式是不推荐的。当在程序中调用了被deprecated修饰的函数时,编译器将给出C4996警告,并且可以指定具体的警告信息。该警告信息可以来源于定义的宏。

例如:

// compile with: /W3

#define MY_TEXT “function is deprecated”

void func1(void) {}

__declspec(deprecated) void func1(int) {}

__declspec(deprecated(“** this is a deprecated function **”)) void func2(int) {}

__declspec(deprecated(MY_TEXT)) void func3(int) {}

int main() {

func1();

func1(1);   // C4996,警告信息:warning C4996: ‘func1′: was declared deprecated

func2(1);   // C4996,警告信息:warning C4996: ‘func2′: ** this is a deprecated function **

func3(1);   // C4996,警告信息:warning C4996: ‘func3′: function is deprecated

}

dllimport,dllexport:

格式:

__declspec( dllimport ) declarator

__declspec( dllexport ) declarator

分别用来从dll导入函数,数据,或对象以及从dll中导出函数,数据,或对象。相当于定义了dll的接口,为它的客户exe或dll定义可使用的函数,数据,或对象。

将函数声明成dllexport就可以免去定义模块定义(.DEF)文件。

dllexport代替了__export关键字。

被声明为dllexport的C++函数导出时的函数名将会按照C++规则经过处理。如果要求不按照C++规则进行名字处理,请使用.def文件或使用extern “C”。

jitintrinsic:

格式:__declspec(jitintrinsic)

用于标记一个函数或元素是位通用语言运行时(CLR)。主要用于Microsoft提供的某些库中。

使用jitintrinsic会在函数签名中加入MODOPT(IsJitIntrinsic)。

naked:

格式:__declspec(naked) declarator

此关键字仅用于x86系统,多用于虚拟设备驱动。此关键字可以使编译器在生成代码时不包含任何注释或标记。仅可以对函数的定义使用,不能用于数据声明、定义,或者函数的声明。

noalias:

仅适用于函数,它指出该函数是半纯粹的函数。半纯粹的函数是指仅引用或修改局部变量、参数和第一层间接参数。它是对编译器的一个承诺,如果该函数引用全局变量或第二层间接指针参数,则编译器会生成中断应用程序的代码。

restrict:

格式:__declspec(restrict) return_type f();

仅适用于返回指针的函数声明或定义,如,CRT的malloc函数:__declspec(restrict) void *malloc(size_t size);它 告诉编译器该函数返回的指针不会与任何其它的指针混淆。它为编译器提供执行编译器优化的更多信息。对于编译器来说,最大的困难之一是确定哪些指针会与其它 指针混淆,而使用这些信息对编译器很有帮助。有必要指出,这是对编译器的一个承诺,编译器并不对其进行验证。如果您的程序不恰当地使用__declspec(restrict),则该程序的行为会不正确。

noinline:

因为在类定义中定义的成员函数默认都是inline的,__declspec(naked)用于显式指定类中的某个函数不需要inline(内联)。如果一个函数很小而且对系统性能影响不大,有必要将其声明为非内敛的。例如,用于处理错误情况的函数。

noreturn:

一个函数被__declspec(noreturn)所修饰,那么它的含义是告诉编译器,这个函数不会返回,其结果是让编译器知道被修饰为__declspec(noreturn)的函数之后的代码不可到达。

如果编译器发现一个函数有无返回值的代码分支,编译器将会报C4715警告,或者C2202错误信息。如果这个代码分支是因为函数不会返回从而无法到达的话,可以使用约定__declspec(noreturn)来避免上述警告或者错误。

将一个期望返回的函数约定为__declspec(noreturn)将导致未定义的行为。

在下面的这个例子中,main函数没有从else分支返回,所以约定函数fatal为__declspec(noreturn)来避免编译或警告信息。

__declspec(noreturn) extern void fatal () {}

int main() {

if(1)

return 1;

else if(0)

return 0;

else

fatal();

}

nothrow:

格式:return-type __declspec(nothrow) [call-convention] function-name ([argument-list])

可用于函数声明。告诉编译器被声明的函数以及函数内部调用的其它函数都不会抛出异常。

novtable:

可用于任何类声明中,但最好只用于纯接口类,即类本身从不实例化。此关键字的声明将阻止编译器对构造和析构函数的vfptr的初始化。可优化编译后代码大小。

如果试图实例化一个用__declspec(novtable)声明的类然后访问类中成员,则会在运行时产生访问错误(access violation,即AV)。

process:

表示你的托管应用程序进程应该拥有一份指定全局变量,静态成员变量,或所有应用程序域共享的静态本地变量的拷贝。在使用/clr:pure进行编译时,应该使用__declspec(process),因为使用/clr:pure进行编译时,在默认情况下,每个应用程序域拥有一份全局和静态变量的拷贝。在使用/clr进行编译时,不必使用__declspec(process),因为使用/clr进行编译时,在默认情况下,每个进程有一份全局和静态变量的拷贝。

只有全局变量,静态成员变量,或本地类型的本地静态变量可以用__declspec(process)修饰。

在使用/clr:pure进行编译时,被声明为__declspec(process)的变量同时也应该声明为const类型。

如果想每个应用程序域拥有一份全局变量的拷贝时,请使用appdomain。

property:

格式:

__declspec( property( get=get_func_name ) ) declarator

__declspec( property( put=put_func_name ) ) declarator

__declspec( property( get=get_func_name, put=put_func_name ) ) declarator

该属性可用于类或结构定义中的非静态“虚数据成员”。实际上就是做了一个映射,把你的方法映射成属性,以供访问。get和put就是属性访问的权限,一个是读的权限,一个是写的权限。当编译器看到被property修饰的数据成员出现在成员选择符(“.” 或”->”)的右边的时候,它将把该操作转换成get或put方法。该修饰符也可用于类或结构定义中的空数组。

用法如下:

struct S {

int i;

void putprop(int j) {

i = j;

}

int getprop() {

return i;

}

__declspec(property(get = getprop, put = putprop)) int the_prop;

};

int main() {

S s;

s.the_prop = 5;

return s.the_prop;

}

selectany:

格式:__declspec(selectany) declarator

在MFC,ATL的源代码中充斥着__declspec(selectany)的声明。selectany可以让我们在.h文件中初始化一个全局变量而不是只能放在.cpp中。比如有一个类,其中有一个静态变量,那么我们可以在.h中通过类似__declspec(selectany) type class::variable = value;这样的代码来初始化这个全局变量。既是该.h被多次include,链接器也会为我们剔除多重定义的错误。对于template的编程会有很多便利。

用法如下:

__declspec(selectany) int x1=1; //正确,x1被初始化,并且对外部可见

const __declspec(selectany) int x2 =2; //错误,在C++中,默认情况下const为static;但在C中是正确的,其默认情况下const不为static

extern const __declspec(selectany) int x3=3; //正确,x3是extern const,对外部可见

extern const int x4;

const __declspec(selectany) int x4=4; //正确,x4是extern const,对外部可见

extern __declspec(selectany) int x5; //错误,x5未初始化,不能用__declspec(selectany)修饰

class X {

public:

X(int i){i++;};

int i;

};

__declspec(selectany) X x(1); //正确,全局对象的动态初始化

thread:

格式:__declspec(thread) declarator

声明declarator为线程局部变量并具有线程存储时限,以便链接器安排在创建线程时自动分配的存储。

线程局部存储(TLS)是一种机制,在多线程运行环境中,每个线程分配自己的局部数据。在标准多线程程序中,数据是在多个线程间共享的,而TLS是一种为每个线程分配自己局部数据的机制。

该属性只能用于数据或不含成员函数的类的声明和定义,不能用于函数的声明和定义。

该属性的使用可能会影响DLL的延迟载入。

该属性只能用于静态数据,包括全局数据对象(static和extern),局部静态对象,类的静态数据成员;不能用于自动数据对象。

该属性必须同时用于数据的声明和定义,不管它的声明和定义是在一个文件还是多个文件。

__declspec(thread)不能用作类型修饰符。

如果在类声明的同时没有定义对象,则__declspec(thread)将被忽略,例如:

// compile with: /LD

__declspec(thread) class X

{

public:

int I;

} x;   //x是线程对象

X y;   //y不是线程对象

下面两个例子从语义上来说是相同的:

__declspec(thread) class B {

public:

int data;

} BObject;   //BObject是线程对象

class B2 {

public:

int data;

};

__declspec(thread) B2 BObject2;   // BObject2是线程对象

uuid:

格式:__declspec( uuid(“ComObjectGUID”) ) declarator

将具有唯一标识符号的已注册内容声明为一个变量,可使用__uuidof()调用。

用法如下:

struct __declspec(uuid(“00000000-0000-0000-c000-000000000046″)) IUnknown;

struct __declspec(uuid(“{00020400-0000-0000-c000-000000000046}”)) IDispatch;

2013年01月23日

如同名字一样的意思,NameSpace:名字空间,之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,为了解决这个问题,引入了名字空间这个概念,通过使用using namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的.这样以来就不会引起不必要的冲突了.
所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
一 :<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout

建议用
#include<iostream>
int main()
{
std::cout<<”hello, world”<<endl;
return 0;
}
这种写法。

如果程序要调用std空间里面的定义,比如cout定义时,就需要using

一 、<iostream>和<iostream.h>和格式不一样 前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。 后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因 此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。 二、namespace是指标识符的各种可见范围  C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。 由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择: 1、直接指定标识符。  例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl; 2、使用using关键字。  using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl; 3、最方便的就是使用using namespace std  例如:   #include<iostream>   #include<sstream>   #include<string>   using namespace std;   这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout << hex << 3.4 << endl; 因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。 所以就有了<iostream>和<iostream.h>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。 命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加”.h” 三、简便理解  98年以后的c++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题。举一个实例,请注意以下两个头文件:   // one.h   char func(char);   class String { … };   // somelib.h   class String { … };   如果按照上述方式定义,那么这两个头文件不可能包含在同一个程序中,因为String类会发生冲突。   所谓命名空间,是一种将程序库名称封装起来的方法,它就像在各个程序库中立起一道道围墙。

2006年04月20日

Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的
API,使他们能够用纯Java API
来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。

  一、连接各种数据库方式速查表

  下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。

  1、Oracle8/8i/9i数据库(thin模式)

Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);


  2、DB2数据库

Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();
String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);


  3、Sql Server7.0/2000数据库

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";
//mydb为数据库
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);


  4、Sybase数据库

Class.forName("com.sybase.jdbc.SybDriver").newInstance();
String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名
Properties sysProps = System.getProperties();
SysProps.put("user","userid");
SysProps.put("password","user_password");
Connection conn= DriverManager.getConnection(url, SysProps);


  5、Informix数据库

Class.forName("com.informix.jdbc.IfxDriver").newInstance();
String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;
user=testuser;password=testpassword"; //myDB为数据库名
Connection conn= DriverManager.getConnection(url);


  6、MySQL数据库

Class.forName("org.gjt.mm.mysql.Driver").newInstance();
String url ="jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
//myDB为数据库名
Connection conn= DriverManager.getConnection(url);


  7、PostgreSQL数据库

Class.forName("org.postgresql.Driver").newInstance();
String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名
String user="myuser";
String password="mypassword";
Connection conn= DriverManager.getConnection(url,user,password);


  8、access数据库直连用ODBC的

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;
String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");
Connection conn = DriverManager.getConnection(url,"","");
Statement stmtNew=conn.createStatement() ;


  二、JDBC连接MySql方式

  下面是使用JDBC连接MySql的一个小的教程

  1、查找驱动程序

  MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。

  2、动态指定classpath

  如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。

  3、加载驱动程序

try{
 Class.forName(com.mysql.jdbc.Driver);
 System.out.println(Success loading Mysql Driver!);
}catch(Exception e)
{
 System.out.println(Error loading Mysql Driver!);
 e.printStackTrace();
}


  4、设置连接的url

jdbc:mysql://localhost/databasename[?pa=va][&pa=va]


  三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧

  1、在客户端软件开发中使用Thin驱动程序

 
 在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种
用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本
地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性
能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,
Thin驱动程序的性能都超过了OCI驱动程序。

  2、关闭自动提交功能,提高系统性能

  在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:

  conn.setAutoCommit(false);

  值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。

  3、在动态SQL或有时间限制的命令中使用Statement对象

 
 在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个
SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析
和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件
中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。

  此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。

  4、利用helper函数对动态SQL命令进行格式化

 
 在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O’Reilly插入表
中的SQL命令,则必须使用二个相连的“””号替换O’Reilly中的“’”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方
法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,
然后让它输出基于Oracle的to_date()函数的字符串表达式。

  5、利用PreparedStatement对象提高数据库的总体效率

 
 在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个
PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的
企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不
是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下
使用PreparedStatement对象。

  6、在成批处理重复的插入或更新操作中使用PreparedStatement对象

 
 如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和
CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用
addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的
setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批
处理机制,可以以如下所示的方式调用setExecuteBatch():

PreparedStatement pstmt3D null;
try {
 ((OraclePreparedStatement)pstmt).setExecuteBatch(30);
 …
 pstmt.executeUpdate();
}


 
 调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方
法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。

  7、使用Oracle locator方法插入、更新大对象(LOB)

 
 Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用
PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用
setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用
PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用
locator的方法来插入、更新或获取LOB的值。

  8、使用SQL92语法调用存储过程

  在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。

  9、使用Object SQL将对象模式转移到数据库中

 
 既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java
bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据
库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模
仿其数据和操作,然后使用JPublisher等工具生成自己的Java
bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的
对象模式。

  10、利用SQL完成数据库内的操作

  我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。

 
 如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数
据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来
流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。

2006年04月16日
一、慢性咽炎的症状

病因分型

慢性咽炎是一种常见病,为慢性感染所引起的弥漫性咽部病变,主要是咽部粘膜炎症。多发于成年人,其主要病因有屡发急性咽炎、长期粉尘或有害气体刺
激、烟酒过度或其它不良生活习惯、鼻窦炎分泌物刺激、过敏体质或身体抵抗力减低等。慢性咽炎也可以是某些全身性疾病的局部表现,如贫血、糖尿病、肝硬化及
慢性肾炎等。
自诊要点

咽部不适,有异物感,总感到咽部有咽不下又吐不出的东西,刺激咳嗽,干燥、发胀、堵塞、瘙痒等,但很少有咽痛。清晨常吐出粘稠痰块易引起恶心。由于食道或下咽部的癌症早期也会有类似的症状,因此发现以上症状之后应到医院做详细的检查,方能确诊。

治疗建议

应由医生根据病因进行有针对性的治疗。局部对症治疗可以选用中成药,如利咽灵、草珊瑚含片、保安散等,可同时配合泡茶饮:双花、麦冬、胖大海、生
甘草各等份,开水冲泡频服。清咽饮:乌梅肉、生甘草、沙参、麦冬、桔梗、元参各50克,捣碎混匀,每日3次,每次服15克左右,以沸水冲饮。
注意事项

注意口腔卫生,坚持早晚及饭后刷牙。减少烟酒和粉尘刺激,还需纠正张口呼吸的不良习惯。应加强身体锻炼,增强体质,预防呼吸道感染,少用烟酒,积
极治疗咽部周围器官的疾病。合理安排生活,保持心情舒畅,避免烦恼郁闷。保持室内合适的温度和湿度,空气新鲜。宜吃清淡、具有酸、甘滋阴的一些食物,如水
果、新鲜蔬菜、青果等。经常含服四季润喉片、薄荷喉症片等。
慢性咽炎

慢性咽炎是咽部粘膜的慢性炎症,其中弥漫性炎症常为上呼吸道慢性卡他性炎症的一部分,局限性炎症则多伴有咽淋巴样组织的炎症。本病相当于中医的慢喉痹。

1。 西医诊断标准:

(l)病史:常有急性咽炎反复发作史,或因鼻病长期张口呼吸及烟酒过度、坏境空气干燥、粉尘和刺激性气体污染等。

(2)症状:咽部不适,或疼、或痒、或干燥感、灼热感、烟熏感、异物感等;刺激性咳嗽,晨起用力咳出分泌物,甚或作呕。病程2个月以上,常因受凉、感冒、疲劳、多言等原因致症状

(3)检查:咽部慢性充血,加重。呈暗红色,或树枝状充血;咽后壁淋巴滤泡增生,或咽侧索肿大;咽粘膜增生肥厚,或干燥、萎缩、变薄,有分泌物附着.具各上述症状及1项 或1项以上检查所见,即可诊断。

2。中医辨证:

虚火上炎证,肺脾气虚证,痰热证,痰瘀互阻证

咽的急性发炎 ,跟扁桃体急性发炎很相似。咽炎及扁桃体炎都可由同一种细菌及病毒所引起,但咽炎的症状没有扁桃体那么严重。有些医学人士把这两种疾病简称之为急性咽喉炎。

慢性咽炎为慢性感染所引起的弥漫性咽部病变,主要是咽部粘膜炎症。多发于成年人,在城市居民中发病率占咽喉疾病的10%至20%左右。因其病程长,症状顽固,短期难见显效,故不易治愈。其主要病因大致如下:

1、 急性咽炎反复发作未能彻底治愈而转成慢性,长期粉尘或有害气体刺激、烟酒过度或其它不良生活习惯、鼻窦炎分泌物刺激、过敏体质或身体抵抗力减低等。

2 、 慢性咽炎也可以是某些全身性疾病的局部表现,如贫血、消化不良、大便长期秘结、心脏病、支气管炎、哮喘、肝脏病变、糖尿病及慢性肾炎等。



3、 职业因素。主要多发于嗓音工作者,如:教师、演员等。因长期多语言和演唱,可刺激咽部,引起慢性充血而致病。慢性咽炎自诊要点:
症状多样,咽部不适,有异物感,痰粘滞感,总感到咽部有咽不下又吐不出的东西,堵塞、发胀、灼热、干燥、发痒、刺激咳嗽、微有咽痛等。常以咳嗽来清除分泌
物,特别在早晨用力咳嗽消除咽部分泌物时,症状有短暂缓解。由于食道或下咽部的癌症早期也会有类似的症状,因此发现以上症状之后应到医院做详细的检查,方
能确诊。


慢性咽炎形成后又分三种类型的病理变化:



一、是慢性单纯性咽炎。表现为咽部粘膜慢性充血;

二、是肥厚性咽炎。主要表现为咽部粘膜充血肥厚,粘膜下有广泛的结缔组织及淋巴组织增生;

三、是慢性萎缩性咽炎。主要表现为粘膜层及粘膜下层萎缩变薄,咽后壁有痂皮附着,分泌减少。



中医将本病归纳为三种类型:



一、阴虚火炎型:咽部不适,痛势隐隐,有异物感,粘痰量少,伴有午后烦热,腰腿酸软,舌质红,脉象细数。

二、痰阻血瘀型:咽部干涩,痛呈刺痛,咽肌膜深红,常因频频清嗓而恶心不适。舌质红,苔黄腻,脉滑而数。

三、阴虚津枯型:咽干甚痒,灼热燥痛,饮水后痛可暂缓,异物感明显,夜间多梦,耳鸣眼花。舌质红少津,脉细数。



慢性咽炎的治疗
西医一般注重局部用药,如:嗽口药,用2%棚酸溶液,3%盐水和1:5000呋喃西林溶液反复嗽口,或者用2%碘甘油、5%强蛋白银液途于咽壁,或用碘含
片、杜米芬、薄荷等含于口腔内等,有一定缓解症状之功能。局部对症治疗也可以选用中成药,如草珊瑚含片、西瓜霜等。


中医治疗本病着重于治本,按辩证分型法用药,疗效较好。一般用药为:阴虚火炎型者,用养阴清肺汤加味(麦冬、生地、玄参、白芍、甘草、生石膏、薄
荷、川贝粉、丹皮、桑叶等);痰阻血瘀型者,用消瘰丸加味(玄参,牡蛎、川贝、生地、麦冬、三棱、昆布、海藻等);阴虚津枯型者,用生脉饮加味(白晒参、
麦冬、五味子、石斛、玉竹、白茅根、竹茹等),每日一剂,频频润咽服之。


注意事项 :忌辛辣之品及烟酒刺激。注意口腔卫生。



(加强身体锻炼,增强体质,预防呼吸道感染,合理安排生活,保持心情舒畅,避免烦恼郁闷等。)



饮食调理:利咽茶饮:双花、麦冬、木蝴蝶、胖大海、生甘草各3-5克,开水冲泡频服。清咽饮:乌梅肉、生甘草、沙参、麦冬、桔梗、元参各50克,捣碎混匀,每日3次,每次服15克左右,以沸水冲饮。



慢性咽炎治愈后,为巩固疗效以防再发,可常吃下列食品:绿豆海带汤



原料:绿豆一两、海带一两、白糖少许。

制法:将绿豆与海带(切丝)放于锅中,加水煮烂,后入白糖调味,每日当茶喝。



西瓜汁:将西瓜切开取汁,频频当茶饮。即可清热除烦,又能养阴润燥,甚宜常吃。



巧用药茶疗慢性咽炎



慢性咽炎是咽部黏膜、黏膜下层及淋巴组织的慢性炎症,视其病变情况,可分为单纯性、增生性和萎缩性三种类型。慢性咽炎的发病原因很多,如急性咽炎
反复发作和邻近器官疾病(慢性扁桃体炎、牙龈炎、慢性鼻炎、慢性鼻窦炎)等都可引起。外因气候寒冷干燥,工作环境中的空气被粉尘、化学气体污染,烟酒和辛
辣饮食长期刺激,以及由于职业因素而用嗓过多的人都易患慢性咽炎。此外,长期生活不规律、疲劳、精神紧张,可使身体抵抗力下降,细菌和病毒容易反复感染,
也会引起慢性咽炎。
目前治疗慢性咽炎的方法很多,如西医一般主张用口泰、复方硼砂溶液等漱口液,含服华素片、安吉含片、g菌含片等。这些药物长期使用会导致口腔
内环境紊乱。对于肥厚增生性咽炎,可采用激光、微波、冷冻等方法。但这些疗法目前有滥用趋势,门诊上经常见到因手术后咽部瘢痕严重增生、挛缩而病情加重前
来就诊的病人。
慢性咽炎相当于中医的“虚火喉痹”,其病因病机为肺肾阴虚导致的虚火上升、咽喉失养。治宜滋养肺肾、清热化痰、润喉利咽。经验证明,正确应用药茶有助于治疗慢性咽炎。下列十则药茶方可供选用。



【罗汉果茶】

罗汉果1个。将罗汉果切碎,用沸水冲泡10分钟后,不拘时饮服。每日1~2次,每次1个。功能清肺化痰,止渴润喉。主治慢性咽喉炎,肺阴不足、痰
热互结而出现的咽喉干燥不适,喉痛失音,或咳嗽口干等。《食物中药与便方》谓:“演员、教师、广播员等需保护发音器官者常以罗汉果切碎,泡水代茶饮有
效。”


【橄榄茶】

取橄榄两枚,绿茶1g。将橄榄连核切成两半,与绿茶同放入杯中,冲入开水,加盖闷5分钟后饮用。适用于慢性咽炎,咽部异物感者。



【大海生地茶】

胖大海5枚,生地12g,冰糖30g,茶适量。上药共置热水瓶中,沸水冲泡半瓶,盖闷15分钟左右,不拘次数,频频代茶饮。根据患者的饮量,每日
2~3剂。功能清肺利咽,滋阴生津。用于慢性咽喉炎属肺阴亏虚者,如声音嘶哑,多语则喉中燥痒或干咳,喉部暗红,声带肥厚,甚则声门闭合不全,声带有小
结,舌红苔少等。对于肺阴不足、虚火夹实之慢性喉炎而兼大便燥结者,用之最宜。


【橄揽海蜜茶】

橄榄3g,胖大海3枚,绿茶3g,蜂蜜1匙。先将橄榄放入清水中煮片刻,然后冲泡胖大海及绿茶,闷盖片刻,入蜂蜜调匀,徐徐饮之。每日1~2剂。功能清热解毒,利咽润喉。主治慢性咽喉炎,咽喉干燥不舒,或声音嘶哑等属阴虚燥热证者。



【二绿女贞茶】

绿萼梅、绿茶、橘络各3g,女贞子6g。先将女贞子捣碎后,与前三味共入杯内,以沸水冲泡即可。每日1剂,不拘时饮服。功能养阴利咽,行气化痰。对肝肾阴虚,虚火上浮,气郁痰结之咽痛不适,咽喉异物感,饮之有良益。



【桑菊杏仁茶】

桑叶10g,菊花10g,杏仁10g,冰糖适量。将杏仁捣碎后,与桑叶、菊花、冰糖共置保温瓶中,加沸水冲泡,约盖闷15分钟后,即可当茶水饮用,边饮边加开水,每天1剂。功能清热疏风,化痰利咽。



【双根大海茶】

板蓝根15g,山豆根10g,甘草10g,胖大海5g。共置保温瓶中,用沸水冲泡,盖闷20分钟后即可当茶水饮用。也可加水煎煮后,倒保温瓶中慢慢饮用,每天1剂。有清热、解毒、利咽的作用,适用于慢性咽炎咽喉疼痛明显者。



【马鞭草绿豆蜜茶】

鲜马鞭草50g,绿豆30g,蜂蜜30g。将绿豆洗净沥干,新鲜马鞭草连根洗净,用线扎成2小捆,与绿豆一起放锅内,加水1500毫升用小火炖1小时,至绿豆酥烂时离火,捞去马鞭草,趁热加入蜂蜜搅化即可饮汤食豆。每日1剂,分2次服,连服数日。



【清音茶】

药用胖大海5g,蝉衣3g,石斛15g。水煎代茶饮。功能养阴润喉,利咽治喑,适用于慢性咽炎伴有声音嘶哑者。



【山楂利咽茶】

药用生山楂20g,丹参20g,夏枯草15g。使用时,先用清水洗去浮尘,然后加水煎30分钟后,滤取药汁,一日数次,当茶频饮。功能活血散结,清热利咽。适用于慢性咽炎而咽部淋巴滤泡增生明显者。



一、慢性咽炎的治疗

巧用药茶疗慢性咽炎



慢性咽炎是咽部黏膜、黏膜下层及淋巴组织的慢性炎症,视其病变情况,可分为单纯性、增生性和萎缩性三种类型。慢性咽炎的发病原因很多,如急性咽炎
反复发作和邻近器官疾病(慢性扁桃体炎、牙龈炎、慢性鼻炎、慢性鼻窦炎)等都可引起。外因气候寒冷干燥,工作环境中的空气被粉尘、化学气体污染,烟酒和辛
辣饮食长期刺激,以及由于职业因素而用嗓过多的人都易患慢性咽炎。此外,长期生活不规律、疲劳、精神紧张,可使身体抵抗力下降,细菌和病毒容易反复感染,
也会引起慢性咽炎。
目前治疗慢性咽炎的方法很多,如西医一般主张用口泰、复方硼砂溶液等漱口液,含服华素片、安吉含片、g菌含片等。这些药物长期使用会导致口腔
内环境紊乱。对于肥厚增生性咽炎,可采用激光、微波、冷冻等方法。但这些疗法目前有滥用趋势,门诊上经常见到因手术后咽部瘢痕严重增生、挛缩而病情加重前
来就诊的病人。
慢性咽炎相当于中医的“虚火喉痹”,其病因病机为肺肾阴虚导致的虚火上升、咽喉失养。治宜滋养肺肾、清热化痰、润喉利咽。经验证明,正确应用药茶有助于治疗慢性咽炎。下列十则药茶方可供选用。



【罗汉果茶】

罗汉果1个。将罗汉果切碎,用沸水冲泡10分钟后,不拘时饮服。每日1~2次,每次1个。功能清肺化痰,止渴润喉。主治慢性咽喉炎,肺阴不足、痰
热互结而出现的咽喉干燥不适,喉痛失音,或咳嗽口干等。《食物中药与便方》谓:“演员、教师、广播员等需保护发音器官者常以罗汉果切碎,泡水代茶饮有
效。”


【橄榄茶】

取橄榄两枚,绿茶1g。将橄榄连核切成两半,与绿茶同放入杯中,冲入开水,加盖闷5分钟后饮用。适用于慢性咽炎,咽部异物感者。



【大海生地茶】

胖大海5枚,生地12g,冰糖30g,茶适量。上药共置热水瓶中,沸水冲泡半瓶,盖闷15分钟左右,不拘次数,频频代茶饮。根据患者的饮量,每日
2~3剂。功能清肺利咽,滋阴生津。用于慢性咽喉炎属肺阴亏虚者,如声音嘶哑,多语则喉中燥痒或干咳,喉部暗红,声带肥厚,甚则声门闭合不全,声带有小
结,舌红苔少等。对于肺阴不足、虚火夹实之慢性喉炎而兼大便燥结者,用之最宜。


【橄揽海蜜茶】

橄榄3g,胖大海3枚,绿茶3g,蜂蜜1匙。先将橄榄放入清水中煮片刻,然后冲泡胖大海及绿茶,闷盖片刻,入蜂蜜调匀,徐徐饮之。每日1~2剂。功能清热解毒,利咽润喉。主治慢性咽喉炎,咽喉干燥不舒,或声音嘶哑等属阴虚燥热证者。



【二绿女贞茶】

绿萼梅、绿茶、橘络各3g,女贞子6g。先将女贞子捣碎后,与前三味共入杯内,以沸水冲泡即可。每日1剂,不拘时饮服。功能养阴利咽,行气化痰。对肝肾阴虚,虚火上浮,气郁痰结之咽痛不适,咽喉异物感,饮之有良益。



【桑菊杏仁茶】

桑叶10g,菊花10g,杏仁10g,冰糖适量。将杏仁捣碎后,与桑叶、菊花、冰糖共置保温瓶中,加沸水冲泡,约盖闷15分钟后,即可当茶水饮用,边饮边加开水,每天1剂。功能清热疏风,化痰利咽。



【双根大海茶】

板蓝根15g,山豆根10g,甘草10g,胖大海5g。共置保温瓶中,用沸水冲泡,盖闷20分钟后即可当茶水饮用。也可加水煎煮后,倒保温瓶中慢慢饮用,每天1剂。有清热、解毒、利咽的作用,适用于慢性咽炎咽喉疼痛明显者。



【马鞭草绿豆蜜茶】

鲜马鞭草50g,绿豆30g,蜂蜜30g。将绿豆洗净沥干,新鲜马鞭草连根洗净,用线扎成2小捆,与绿豆一起放锅内,加水1500毫升用小火炖1小时,至绿豆酥烂时离火,捞去马鞭草,趁热加入蜂蜜搅化即可饮汤食豆。每日1剂,分2次服,连服数日。



【清音茶】

药用胖大海5g,蝉衣3g,石斛15g。水煎代茶饮。功能养阴润喉,利咽治喑,适用于慢性咽炎伴有声音嘶哑者。



【山楂利咽茶】

药用生山楂20g,丹参20g,夏枯草15g。使用时,先用清水洗去浮尘,然后加水煎30分钟后,滤取药汁,一日数次,当茶频饮。功能活血散结,清热利咽。适用于慢性咽炎而咽部淋巴滤泡增生明显者。

参考资料:http://www.nhhn.gd.cn/zy/2005-05/f1.htm

回答者:完颜康康 – 榜眼 十三级 11-3 21:33



——————————————————————————–



怎样有效治疗慢性咽炎?



慢性咽炎系咽粘膜的慢性炎症,常为呼吸道慢性炎症的一部分。多为急性咽炎反复发作或延误治疗转为慢性或者各种鼻病后因鼻阻塞而长期张口呼吸及鼻腔
分泌物下流,致长期刺激咽部,或慢性扁桃体炎,龋病等影响所致,也可以因为各种物理化学因素刺激:如粉尘、颈部放疗、长期接触化学气体、烟酒过度等,另外
全身因素如各种慢性病等都可继发本病。主要分为慢性单纯性咽炎、慢性肥厚性咽炎、萎缩性或干燥性咽炎。主要表现为咽部可有各种不适感觉,如异物感、发痒、
灼热、干燥、微痛、干咳、痰多不易咳净,讲话易疲劳,或于刷牙漱口,讲话多时易恶心作呕。


就诊指南:



1、消除各种致病因素,如治疗全身性疾病,治疗鼻窦炎。注意营养,增强体质锻练。避免刺激性食物及烟酒,在有粉尘或刺激性气体环境中工作者应戴口罩。



2、根据不同类型的咽炎采取不同的治疗办法。局部可用复方硼砂溶液、呋喃西林溶液、淡盐水漱口,各种含片含服。金嗓利咽丸、乐频清口服等。



3、不随便使用胖大海冲服。



4、肥厚性咽炎可以应用激光烧灼或者微波凝固。



5、可以进行雾化吸入治疗。对干燥、干咳等症状有一定的好处。



三种方法巧疗慢性咽炎



1、按摩:



①用拇指跟食、中指揉咽喉部两侧20~30次。



②用拇指、食指捏揪咽喉部皮肤20~30次,使局部发红,咽喉发热为佳。按压翳风、天突、合谷穴,每穴1分钟。每日上晚各1次。



2、灸法:



取合谷、曲池、外关、任选一穴,用温和灸法或指压法,每次5~20分钟,每当症状发作时施治。



3、刺血疗法:



取耳背上部静脉,先用手轻揉患侧耳部,使其局部充血,再于耳后寻找其静脉,局部常规消毒后,用毫针于耳后静脉点刺,挤出血液3~5滴,即用酒精棉
球压按针孔。每日一次。第二次在患侧耳背施术部位下方点刺。第三次仍在第一次部位。此法于小儿尤佳。也可用三棱针点刺少商、内道及耳背的脉络,及血数滴,
每日一次。


慢性咽炎的饮食调治



1.吃富含胶原蛋白和弹性蛋白的食物,如猪蹄、猪皮、蹄筋、鱼类、豆类、海产品等,有利于慢性咽炎损伤部位的修复。



2.多摄入富含B族维生素的食物,如动物肝脏、瘦肉、鱼类、新鲜水果、绿色蔬菜、奶类、豆类等,有利于促进损伤咽部的修复,并消除呼吸道黏膜的炎症。



3.少吃或不吃煎炸、辛辣刺激性食物,如:油条、麻团、炸糕、辣椒、大蒜、胡椒粉等。



4.经常饮用一些利咽生津的食疗饮品,以下两例供参考:绿茶蜂蜜饮:绿茶5克,蜂蜜适量。将绿茶置杯中,冲入沸水,加入蜂蜜饮服,每日1剂。可清
热利咽,润肺生津。百合绿豆汤:百合20克,绿豆50克,冰糖适量。将百合、绿豆加清水适量煮熟,加入冰糖饮服,每日1剂。可清热润肺,养阴生津。
回答者:与尔同轩 - 举人 五级 2-12 16:36
提问者对于答案的评价:
谢谢
评价已经被关闭 目前有 1 个人评价


0% (0)
不好
100% (1)
对最佳答案的评论
对于咽炎的治疗,我认为使用咽可舒治疗贴效果好,不仅不用打针吃药,而且作用效果显著,其采用中医的疗法,对胃肠没有
任何副作用,一些中药偏方,不是每个人都适用,而且使用不当会延长病程,不利于疾病的治愈,所以我迥您推荐咽可舒治疗贴,您试一试,我在盒子上找到了生产
厂家的电话,你可以打电话问一下,0532-85065916
评论者: xiaoguwen试用期 一级
目前慢性咽喉炎还无法根治,有专家认为这应该是免疫性的问题!!当然通过药物和激光是可以减轻症状的!!但最主要的还是要加强自身锻炼,增加免疫力!!!!

测试宽带连接速度

(不同地区请到自己地区最佳的测速网站测速)
设置宽带网站 www.speedguide.net
用这个网站来修改微软Windows 操作系统的 registry ,或是修改 MTU 达到最佳化的设定
最好是下载能有超过1MB的宽频网络
如果是用ADSL下载不到1MB的或是双向cable modem阳春型(128kb/64kb)或是实用型 , (700kb/100kb)的就没什么用处
因为我相信你们现在大多数用ADSL 大部分的人下载的速度都是1MB以下 , 不是512KBPS就是786KBPS , 其实微软Windows操作系统的registry和MTU默认值下载的最大值都有1MB
如(Windows 98, Windows Me) (Windows XP 有时候已帮你网络速度最佳化了)
在实际的例子中 Windows 98, Windows Me 加速的空间最大 , 但是你的ISP提供给你的速度下载不到1MB 你即使最佳化也没用
就像你最佳化后计算机的设定值变成你的计算机可以达到联机速度 5000KBPS
你的ISP给你的下载最高速度是512KBPS或是786KBPS 你的联机速度也只能有512KBPS或是786KBPS
现在就开始在www.speedguide.net ,这个网站是美国很有名的,
更改微软Windows操作系统的registry和MTU的网站以达到各种速度的最佳化。

设置做法如下:

首先,你的计算机一定要有Winzip8.0或Winrar3.0以上版本的压缩软件
连到 www.speedguide.net
第一步: Windows 98, Windows Me, Windows 2000, Windows XP皆适用
www.speedguide.net, 左上方-Broadband 选项-Downloads/Patches -点击进入:
(注:以下文件都很‘小’ )
Windows 98 的需要的档案:
mtupatch98.zip
sguide_tweak_98_ME
sguide_tweak_98_ME_PPPoE
sg_webtweak_9x.zip

Windows Me 的需要的档案:
sguide_tweak_98_ME
sguide_tweak_98_ME_PPPoE
sg_webtweak_9x.zip

Windows 2000/XP 的需要的档案:
sguide_tweak_2k.zip
sguide_tweak_2k_pppoe.zip
sg_webtweak_2k.zip

以上的程序解压缩后
当扩展名是.reg 就用鼠标左键直接点它
当扩展名是.inf 请用鼠标右键点它 , 会出现下拉式的窗口 如果你是用Winzip中文版选 “安装” 如果你是用Winzip英文版选 “Install”。

(注意:当你解压缩后同时发现 同时有扩展名是.reg的档案 也有扩展名是.inf的档案 切记只要执行扩展名是.reg的档案即可 , 不要去安装扩展名是.inf的档案还有其它的档案也不要碰它们)


第二步 Windows 98, Windows Me, Windows 2000, Windows XP皆适用
请到www.speedguide.net 主页
看到左面Shortcuts一栏-TCP/IP Analyzer 进入, 分析你的网络一些设定值
查一下你的 Default Receive Window (RWIN) = 256960 , 有没有达到256960这个数值
如果没有 请按左面TCP/IP Analyzer 下的 TCP/IP Optimizer 点击进入新页面 下载上方第一个修正程序TCP Optimizer , 然后执行它
执行后 它会出来一个窗口 , 窗口上面显示你是哪种类型上网勾你上网的方式 选择你的宽带方式:
窗口中间勾选 Modify All Network Adapters
窗口下面勾选 Optimal settings 最后按 Apply changes
然后重新开机 再按TCP/IP Analyzer测试一下
应该Default Receive Window (RWIN) = 256960 的值会是256960(或接近)才正确。
(如果不是256960 这通常会出现在Windows 98里 应为它少一个程序,
所以如果你的操作系统是Windows 98 请在第一步骤 相同网页的中间位置下载MS Vtcp.386 fix for Windows 98这个程序解压缩后执行 再重新开机)


第三步 只适用于Windows XP中文版 ,如下
从“开始” –> “运行”, 输入 “gpedit.msc”,->
本机计算机原则–>计算机配置–>管理模板–>网络–>QoS数据包调度程序–>限制可保留频宽–>点击左边“属性”
勾选 “已启用”
频宽限制(%): 20 改为 0
“确定” 再重新开机。

csasd:英文版如下
“start” click “Run” enter “gpedit.msc”
Local Computer Policy—Computer Configuration—Administrative Templates
—Network—QoS Packet Scheduler—Limit reservable bandwidth—setting
Make sure check box on “Enabled” is selected
Bandwidth limit (%)
“Apply” “OK” then restart computer

按照这三个步骤 , 宽带连接速度和下载速度会明显增加。
如果你的ISP给你的下载速度没有超过1MB 基本上也没什么改变 所以不要期望太大 不过你可以试试看。

优化你的系统提高adsl网速

SpeedGuide.net
TCP/IP Analyzer



TCP properties for IP = 60.209.180.153 ()

Browser/OS = Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.2) Gecko/20060308 Firefox/1.5.0.2

Notes: Read the Analyzer FAQ if the above
is not your IP address.

TCP options string = 020405b401010402
MTU = 1500
MTU is fully optimized for broadband.
MSS = 1460
Maximum useful data in each packet = 1460, which equals MSS.
Default TCP Receive Window (RWIN) = 17520

RWIN Scaling (RFC1323) = 0 bits


Unscaled TCP Receive Window = 17520


RWIN is a multiple of MSS
Other RWIN values that might work well with your current MTU/MSS:
513920 (MSS x 44 * scale factor of 8)
256960 (MSS x 44 * scale factor of 4)
128480 (MSS x 44 * scale factor of 2)
 64240 (MSS x 44)

bandwidth * delay product (Note this is not a speed test):

Your TCP Window limits you to: 700.8 kbps (87.6 KBytes/s) @ 200ms
Your TCP Window limits you to: 280.32 kbps (35.04 KBytes/s) @ 500ms
Consider increasing your RWIN value to optimize TCP/IP for broadband.
MTU Discovery (RFC1191) = ON
Time to live left = 114 hops
TTL value is ok.
Timestamps (RFC1323) = OFF
Selective Acknowledgements (RFC2018) = ON
IP type of service field (RFC1349) = 00000000 (0)


以win98和winXP的双系统为例,假设98在C盘,XP在D盘。
1、要删win98,只须启动XP,先在“工具——文件夹选项——查看”里选定“显示所有文件”和取消“隐藏受保护的操作系统文件”,然后删掉C盘下除boot及nt开头的文件以外的所有文件(夹),然后在boot.ini里把win98对应的启动菜单删掉就行了;
2、要删winXP,同样在win98下删掉D盘里的与xp有关的几个文件夹,如果你的D盘里没有其他重要文件的话,也可以像2楼说的直接格式化D盘,还可以删掉C盘里所有以nt开头的文件,然后再用记事本打开C盘里的隐藏文件boot.ini,删去XP的启动菜单。
其他情况的双系统也与此类似。

2006年04月08日
游戏多口你也行
多心草    2004-5-11



1、系统文件修改法:借助十六进制文件编辑软件(如:uitra edit, winHex),运行文件编辑软件,用它来打开QQ
Game。exe文件,然后执行“搜索”/“查找”,在“查找内容”中输入“E87707000085C09090”(不加引号)将其替换为
“EB7707000085C09090”,即可。

2、挂法:下载“2004年5月QQ游戏中心多开窗口补丁”软件,

通过此补丁您可以方便的在一个游戏中进入多个号码。(只要你有那么多QQ号码就可以了。呵呵~)

至于进那么多号码干什么,别问我自己去想吧。 我是受人所拖做一个放上来。希望大家用着方便。

这个补丁支持最新的中心版本0, 10, 104, 8

2006年04月07日

冯武臣教授诊脉水平已达到精确完美的程度,他凭脉五分钟就能将患者的病症、病灶部位、性质一语道破,其精确程度能与 CT 、 B 超、 X光机等现代化检查手段相媲美,人们称赞他“三指晓天下,五分定乾坤”。

1991年5月在美国纽约举行的第十四届世界发明博览会上,他作为中国代表团成员,在大会期间现场演示。仅用四十分钟诊完10名患者,不但对患者的病情诊断准确无误,甚至将一名肿瘤患者左侧
卵巢手术摘除,右侧卵巢肿瘤细胞湿润都诊断得清清楚楚。面对他的诊脉结果,历来对中医诊断持疑义和不信任的美国学者折服了,评委们当场宣布其诊断准确率为
1005 。他的“神速诊脉法”也成了爆炸性新闻而轰动美国,并获得了本届博览会“中医诊断技术”铜奖。张学良将军也赞誉冯武臣为中华民族赢得了荣誉。

“神速诊脉术”技术成果项目荣获陕西省第三届技术成果交易洽谈会金奖。

他尤其对疑难杂症,而且很大一部分都是久治不愈的疑难杂症,甚至是经过现代医疗设备检测、化验而不能确诊的病症,经过特殊诊断和精心治疗,都取得了满意的疗效。中外患者亲切地称誉 冯 教授为“神脉”,称赞他“掌神药更神,艺高德亦高”。


除了对冠心病、糖尿病、胃炎、乙肝、肝硬化、骨质增生、乳腺增生、肺心病等方面疾病诊断准确外,他特别擅长对增生类疾病的诊断,这对癌症早期的发现和治疗
都有着极其有益的作用。据对万余名患者的诊断统计资料表明,他的脉诊准确率已达到98%以上。三五分钟的诊脉就能达到如此准确率,这在中外也是罕见的。

冯武臣的“神速诊断法”顿时成了热门话题,美国“
ABC电视台”、《美国侨报》、《纽约每日新闻》、“
CBC电视台”《台湾星岛日报》等40余家新闻媒体都对冯武臣的“神速诊断法”,以及他所研制的“乾坤系列药品,如乾坤延寿丹、妇科洗剂,脑得生丸,抗骨
增生丸等”作了报导。冯武臣一下子红火起来,每天求诊者络绎不绝。

 

相关链接:

典 型 病 例

来自台湾的一封信

如何预防老年脑病

中医药保健养生之道

临床实践

让妇科病在女性身上永远消失

专 家 谈

 
 

© 2005 陕西冯武臣大药堂制药厂有限公司

地址:陕西省咸阳市渭阳西路西延段1号

电话:(0910)3313723 传真:(0910)3318707