C++常用库使用实例(二)

EVPP

EVPP是一个基于libevent构建的C++网络库,它为开发高性能网络服务器和客户端提供了便利。以下是使用EVPP创建一个简单的HTTP服务器的示例。

在开始之前,确保你已经安装了EVPP和libevent库。

示例:简单的HTTP服务器

main.cpp

#include <evpp/http/http_server.h>

int main() {
    // 创建一个EventLoop线程池,线程数为4
    std::shared_ptr<evpp::EventLoopThread> loop_thread = std::make_shared<evpp::EventLoopThread>();
    loop_thread->Start(true);
    evpp::http::Server http_server(loop_thread->loop(), 18080, "test_server", 4);

    // 定义"/"路径的处理函数,返回"Hello, world!"给客户端
    http_server.RegisterDefaultHandler([](evpp::EventLoop* loop,
                                          const evpp::http::ContextPtr& ctx,
                                          const evpp::http::HTTPSendResponseCallback& cb) {
        cb("Hello, world!");
    });

    // 启动HTTP服务器
    http_server.Init();
    http_server.Start();

    // 运行EventLoop
    loop_thread->loop()->Run();

    return 0;
}

在这个示例中:

  • 我们首先创建了一个EventLoop线程池,接着初始化并启动了一个HTTP服务器,监听18080端口。
  • 使用RegisterDefaultHandler方法注册了一个默认的HTTP请求处理函数,无论什么HTTP请求到来都会返回"Hello, world!"。

为了编译这个程序,你需要在CMakeLists.txt中正确设置库的链接。以下是一个基础的CMakeLists.txt配置示例:

CMakeLists.txt

cmake_minimum_required(VERSION 3.1)
project(evpp_example)

set(CMAKE_CXX_STANDARD 11)

# 假设EVPP和libevent都已经安装在标准的库路径中
find_package(evpp REQUIRED)
find_package(event REQUIRED)

add_executable(evpp_example main.cpp)
target_link_libraries(evpp_example evpp event)

在编译之前,请确保EVPP和libevent库已经被正确安装,并且它们的路径被CMake找到。如果库安装在非标准路径下,你可能需要调整find_package或者使用include_directorieslink_directories来指定库的位置。

编译并运行这个程序后,你可以通过浏览器或者使用curl测试你的服务器,例如访问http://localhost:18080将看到返回的"Hello, world!"消息。

这仅仅是EVPP使用的一个非常基础的示例,EVPP支持丰富的网络编程功能,包括但不限于TCP/UDP服务器和客户端、HTTP客户端、定时任务等。你可以根据项目的需要探索这些高级功能。

gflags

Google的gflags库是一个用于解析命令行参数的C++库,它支持各种类型的参数,可以轻松集成到C++程序中。以下是一个简单的使用gflags的C++示例,演示了如何定义和使用命令行参数。

安装gflags

首先,你需要安装gflags库。在Ubuntu上,你可以使用以下命令安装:

sudo apt-get install libgflags-dev

对于其他操作系统,你可以从gflags GitHub页面下载源代码并按照说明进行安装。

示例代码

接下来,我们将创建一个简单的示例,定义两个命令行参数,一个是整数类型的--port,另一个是字符串类型的--name

main.cpp:

#include <iostream>
#include "gflags/gflags.h"

// 定义命令行参数
DEFINE_int32(port, 8080, "Listening port");
DEFINE_string(name, "World", "Name to greet");

int main(int argc, char* argv[]) {
    // 解析命令行参数
    gflags::ParseCommandLineFlags(&argc, &argv, true);

    std::cout << "Starting server on port " << FLAGS_port << std::endl;
    std::cout << "Hello, " << FLAGS_name << "!" << std::endl;

    return 0;
}
编译和运行

要编译这个示例,你需要链接gflags库。使用g++,命令可能如下所示:

g++ main.cpp -o example -lgflags

运行程序,提供命令行参数:

./example --name="GPT4" --port=9090

你应该会看到输出:

Starting server on port 9090 Hello, GPT4!

如果不提供任何参数,它将使用定义的默认值:

./example

输出将是:

Starting server on port 8080 Hello, World! 注意事项

  • DEFINE_类型宏用于定义不同类型的命令行参数。gflags支持boolint32int64uint64doublestring等类型。
  • gflags::ParseCommandLineFlags函数用于实际解析命令行参数,它应该在程序的早期被调用。
  • 使用FLAGS_参数名访问参数值。

gflags是一个强大的库,适用于需要复杂命令行参数处理的应用程序。通过文档可以了解更多关于定义和管理命令行参数的高级选项。

glog

glog是Google的一个应用级日志库,用于在C++项目中记录日志。它提供了丰富的日志记录功能,包括日志级别、条件日志、日志前缀、线程安全等。以下是一个简单的使用glog记录日志的C++示例。

安装glog

在使用glog之前,您需要确保它已经被安装在您的系统上。您可以通过包管理器(如apt-get, brew)或从源码编译来安装glog

示例代码

以下是一个简单的示例,展示了如何在C++程序中使用glog库进行日志记录。

#include <glog/logging.h>

int main(int argc, char* argv[]) {
    // 初始化Google日志库
    google::InitGoogleLogging(argv[0]);
    
    // 设置日志输出的最低级别
    FLAGS_minloglevel = google::INFO;
    
    // 设置日志文件的路径和文件名前缀
    FLAGS_log_dir = "/path/to/log";
    FLAGS_logtostderr = 0; // 设置为1以同时输出到stderr

    LOG(INFO) << "This is an info log.";
    LOG(WARNING) << "This is a warning log.";
    LOG(ERROR) << "This is an error log.";

    // 条件日志示例
    int num = 10;
    LOG_IF(INFO, num > 5) << "num is greater than 5";

    // 定期记录日志示例
    for (int i = 0; i < 10; i++) {
        LOG_EVERY_N(INFO, 2) << "Logged every 2 iterations, iteration " << google::COUNTER;
    }

    return 0;
}

在这个例子中,我们首先通过google::InitGoogleLogging(argv[0]);初始化了glog库,这是使用glog的第一步。然后,我们通过设置FLAGS_变量来配置日志的一些属性,比如日志级别和日志文件的存储路径。

最后,我们使用LOG宏记录不同级别的日志。LOG_IFLOG_EVERY_N宏允许在满足特定条件时记录日志,或者以一定频率记录日志,这在调试大型应用程序时非常有用。

编译

为了编译这段代码,您需要链接glog库。如果您使用g++,编译命令可能如下所示:

g++ -o example example.cpp -lglog

请确保更改FLAGS_log_dir到一个实际的日志目录,否则,glog可能会报错或者不按预期工作。

通过使用glog,您可以非常方便地在C++项目中实现高效和灵活的日志管理。

nlohmann/json

nlohmann/json 是一个流行的C++ JSON库,以其简洁的语法和高性能著称。它让C++中的JSON序列化和反序列化操作变得非常简单。以下是如何在C++项目中使用这个库的示例。

序列化 JSON

序列化指的是将数据结构或对象状态转换为可以存储或传输的格式,例如转换为字符串。

#include <nlohmann/json.hpp>
#include <iostream>

int main() {
    // 使用nlohmann::json库
    nlohmann::json j;

    // 添加数据
    j["name"] = "John Doe";
    j["age"] = 30;
    j["is_programmer"] = true;
    j["skills"] = {"C++", "JavaScript", "Python"};

    // 序列化为字符串
    std::string s = j.dump(); // 转换为字符串

    std::cout << s << std::endl;

    return 0;
}
反序列化 JSON

反序列化是将JSON字符串解析回相应的数据结构的过程

#include <nlohmann/json.hpp>
#include <iostream>

int main() {
    // JSON字符串
    std::string s = R"({"name":"John Doe","age":30,"is_programmer":true,"skills":["C++","JavaScript","Python"]})";

    // 使用nlohmann::json库解析JSON字符串
    nlohmann::json j = nlohmann::json::parse(s);

    // 访问解析后的数据
    std::cout << "Name: " << j["name"] << std::endl;
    std::cout << "Age: " << j["age"] << std::endl;
    std::cout << "Is a programmer: " << std::boolalpha << j["is_programmer"] << std::endl;
    std::cout << "Skills: ";
    for (auto& skill : j["skills"]) {
        std::cout << skill << " ";
    }
    std::cout << std::endl;

    return 0;
}

为了编译以上示例,你需要确保已经安装了nlohmann/json库。如果你使用的是包管理工具如vcpkg或Conan,可以很容易地添加这个库。

例如,使用vcpkg你可以这样安装nlohmann/json

vcpkg install nlohmann-json

然后在你的CMake项目中,你可以这样找到并链接这个库:

cmake_minimum_required(VERSION 3.1) project(json_example) set(CMAKE_CXX_STANDARD 11) find_package(nlohmann_json CONFIG REQUIRED) add_executable(json_example main.cpp) target_link_libraries(json_example PRIVATE nlohmann_json::nlohmann_json)

这个库的一个强大之处在于它的简洁性和直观性,你可以毫无障碍地将其集成到现有的C++项目中,用于处理复杂的JSON数据。

  • 20
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值