POCO为固定大小的整数定义了类型
头文件:#include “Poco/Types.h”
POCO有两个宏来确定long类型和指针类型的大小。
如果指针为64位,则有宏定义:POCO_PTR_IS_64_BIT,否则无
如果long为64位,则有宏定义:POCO_LONG_IS_64_BIT,否则无
POCO使用宏来确定当前主机的字节顺序:
类Poco::ByteOrder提供了字节顺序转换的静态方法。
所有功能均可用于:Int16, UInt16, Int32, UInt32, Int64, UInt64
vi ByteOrderTest.cpp
#include "Poco/ByteOrder.h"
#include
using Poco::ByteOrder;
using Poco::UInt16;
int main(int argc, char** argv)
{
#ifdef POCO_ARCH_LITTLE_ENDIAN
std::cout << "little endian" << std::endl;
#else
std::cout << "big endian" << std::endl;
#endif
UInt16 port = 80;
UInt16 networkPort = ByteOrder::toNetwork(port);
return 0;
}
编译:
g++ ByteOrderTest.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd
输出:(大部分电脑都是小端)
little endian
Poco::Any的实例可以保存任何内置或用户定义类型的值。
Poco: Any支持值语义。
该值可以通过类型安全的方式提取。
必须知道值的类型才能提取它。
Poco::AnyCast()和Poco::RefAnyCast()函数模板用于提取值。
vi any.cpp
#include "Poco/Any.h"
#include "Poco/Exception.h"
#include
using Poco::Any;
using Poco::AnyCast;
using Poco::RefAnyCast;
int main(int argc, char** argv)
{
Any any(42);
int i = AnyCast<int>(any); // okay
int& ri = RefAnyCast<int>(any); // okay
std::cout << "i = " << i << "; ri = " << ri << std::endl;
try
{
short s = AnyCast<short>(any); // throws BadCastException
}
catch (Poco::BadCastException&)
{
std::cout << "BadCastException" << std::endl;
}
return 0;
}
编译:
g++ any.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd
输出:
i = 42; ri = 42
BadCastException
头文件:#include “Poco/DynamicAny.h”
Poco::DynamicAny的实例可以保存动态任意类型的值。
Poco::DynamicAny支持值语义。
该值可以通过类型安全的方式提取。
支持各种类型(标准类型,std::string)的安全隐式和显式转换(检查范围)。
注意事项:(禁止数字值的数据丢失)
vi dany.cpp
#include "Poco/DynamicAny.h"
#include "Poco/Exception.h"
#include
using Poco::DynamicAny;
int main(int argc, char** argv)
{
DynamicAny any(42);
int i = any;
std::string s(any.convert<std::string>());
std::cout << "i = " << i << "; s = " << s << std::endl;
any.convert(s); // or without the need to cast
const int& ri(any.extract<int>());
short ss = any;
std::cout << "ri = " << ri << "; ss = " << ss << std::endl;
try
{
short s = any.extract<short>(); // throws BadCastException
}
catch (Poco::BadCastException&)
{
std::cout << "BadCastException" << std::endl;
}
return 0;
}
编译:
g++ dany.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd
输出:
i = 42; s = 42
ri = 42; ss = 42
BadCastException
所有POCO异常都是POCO::Exception的子类,Poco::Exception派生自std:: Exception。
头文件:#include “Poco/Exception.h”
比如:
每个Poco::Exception都有一个name名字、message(描述异常的原因)、可选的嵌套异常
POCO_DECLARE_EXCEPTION:声明异常类
POCO_IMPLEMENT_EXCEPTION:实现异常类
// MyException.h
#include “Poco/Exception.h”
POCO_DECLARE_EXCEPTION(MyLib_API, MyException, Poco::Exception)
// MyException.cpp
#include “MyException.h”
POCO_IMPLEMENT_EXCEPTION(MyException, Poco::Exception, “Something really bad happened…”)
运行时检查的宏
1)在调试构建中,可以使用宏poco_debugger()和poco_debugger_msg(message)强制设置断点(如果代码在调试器的控制下运行)。
2)poco_assert、poco_check_ptr和poco_bugcheck在调试和发布版本中都是启用的。在调试版本中,如果调试器可用,则在抛出异常之前触发断点。
3)poco_assert_dbg和poco_debugger仅在调试版本中启用。
4)使用bool Debugger::isAvailable()检查是否在调试器下运行。
5)使用void Debugger::enter()强制一个断点。
6)使用void Debugger::message()将消息写入调试器日志或标准输出。
头文件:Poco/Platform.h
POCO_OS宏可用于确定操作系统。它将有以下值之一:
POCO_OS_AIX
POCO_OS_LINUX
POCO_OS_SOLARIS
POCO_OS_CYGWIN
POCO_OS_MAC_OS_X
POCO_OS_TRU64
POCO_OS_FREE_BSD
POCO_OS_NET_BSD
POCO_OS_VMS
POCO_OS_HPUX
POCO_OS_OPEN_BSD
POCO_OS_VXWORKS
POCO_OS_IRIX
POCO_OS_QNX
POCO_OS_WINDOWS_NT
Windows平台:POCO_OS_FAMILY_WINDOWS
Unix平台:POCO_OS_FAMILY_UNIX
POCO_ARCH宏可用于确定硬件体系结构。它将有以下值之一:
POCO_ARCH_ALPHA
POCO_ARCH_IA64: Intel 64-bit
POCO_ARCH_AMD64
POCO_ARCH_MIPS
POCO_ARCH_ARM
POCO_ARCH_POWER
POCO_ARCH_HPPA
POCO_ARCH_PPC
POCO_ARCH_IA32 : Intel 32-bit
POCO_ARCH_SPARC
POCO_ARCH_LITTLE_ENDIAN:架构是小端序
POCO_ARCH_BIG_ENDIAN:架构是大端序
Poco::Environment的静态函数,用于在运行时确定系统和环境信息。
头文件:#include “Poco/Environment.h”
#include "Poco/Environment.h"
#include
using Poco::Environment;
int main(int argc, char** argv)
{
std::cout
<< "OS Name: " << Environment::osName() << std::endl
<< "OS Version: " << Environment::osVersion() << std::endl
<< "OS Arch: " << Environment::osArchitecture() << std::endl
<< "Node Name: " << Environment::nodeName() << std::endl
<< "Node ID: " << Environment::nodeId() << std::endl;
if (Environment::has("HOME"))
std::cout << "Home: " << Environment::get("HOME") << std::endl;
Environment::set("POCO", "foo");
return 0;
}
编译:
g++ e.cpp -I ~/git/poco/install/include -L ~/git/poco/install/lib -lPocoFoundationd
输出:
OS Name: Linux
OS Version: 6.2.0-37-generic
OS Arch: x86_64
Node Name: laoer-VirtualBox
Node ID: 08:00:27:ad:b1:7a
Home: /home/laoer