c++数据类型常用的宏函数
时间: 2023-09-13 07:13:08 浏览: 62
C++中常用的宏函数有以下几种:
1. 定义常量:使用`#define`宏可以定义常量。例如:
```cpp
#define PI 3.14159
```
2. 最大值和最小值:使用`#define`宏可以定义获取最大值和最小值的函数。例如:
```cpp
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
```
这样可以通过`MAX(a, b)`和`MIN(a, b)`来获取`a`和`b`中的最大值和最小值。
3. 字符串连接:使用`#define`宏可以将多个字符串连接成一个字符串。例如:
```cpp
#define CONCAT(a, b) a##b
```
这样可以通过`CONCAT(str1, str2)`来将`str1`和`str2`连接成一个字符串。
4. 条件编译:使用条件编译可以根据不同的条件选择不同的代码执行路径。例如:
```cpp
#ifdef DEBUG
// 调试模式下的代码
#else
// 正常模式下的代码
#endif
```
这样可以根据是否定义了`DEBUG`宏来选择不同的代码执行路径。
这些是C++中常用的宏函数,可以根据具体需求在代码中使用。注意在使用宏函数时要注意避免一些潜在的问题,比如参数多次求值、宏名与其他标识符冲突等。
相关问题
c++ boost库常用函数
Boost库是一个功能强大的C++库集合,提供了许多常用的函数和模块。以下是一些常用的Boost库函数:
1. 字符串和文本处理库:Boost库提供了丰富的字符串处理功能,比如lexical_cast用于数值转换,format用于字符串格式化,string_algo用于字符串算法。
2. 类型推导:Boost库提供了BOOST_AUTO和BOOST_TYPEOF用于类型推导,可以方便地获取表达式的类型。
3. 智能指针:Boost库提供了多种智能指针,如scoped_ptr、shared_ptr、weak_ptr等,用于管理动态分配的内存。
4. 数组和容器:Boost库提供了多维数组multi_array、动态多维数组、普通数组array、散列容器unordered_set、unordered_map、双向映射容器bimap、环形缓冲区circular_buffer等,方便了数组和容器的操作和管理。
5. XML和JSON解析:Boost库提供了property_tree模块,可用于解析和处理XML和JSON数据。
6. 简化循环:Boost库提供了BOOST_FOREACH宏,可用于简化循环操作。
7. 随机数库:Boost库提供了Random模块,用于生成随机数。
8. 引用库:Boost库提供了ref模块,用于处理引用。
9. 绑定库:Boost库提供了bind模块,用于函数对象的绑定。
10. 线程库:Boost库提供了thread模块,用于跨平台多线程编程。
这些只是Boost库的一部分常用函数,Boost库还有许多其他功能和模块可供使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [C++ Boost库:工厂函数 make_shared](https://blog.csdn.net/u014779536/article/details/116400788)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [【BOOST C++库】BOOST C++库20个分类指南](https://blog.csdn.net/gongdiwudu/article/details/127961836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
C++ select函数的使用
`select()`函数是Unix/Linux网络编程中常用的一个函数,用于多路复用I/O操作,可以同时监听多个文件描述符的可读、可写等事件,并在事件触发时通知应用程序进行相应的处理。以下是`select()`函数的使用步骤:
1. 创建一个`fd_set`类型的变量,用于存储需要监听的文件描述符。
2. 将需要监听的文件描述符添加到`fd_set`变量中,使用`FD_SET()`宏函数实现。
3. 设置`select()`函数的超时时间,或者将其设置为阻塞模式等待事件的发生。
4. 调用`select()`函数开始监听,当有文件描述符满足条件时,`select()`函数返回。
5. 使用`FD_ISSET()`宏函数检查哪些文件描述符满足条件,并进行相应的处理。
下面是一个简单的示例代码,通过`select()`函数监听标准输入和socket连接,并处理可读事件。
```c++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#define MAX_CLIENTS 10
#define BUFFER_SIZE 1024
int main(int argc, char *argv[]) {
int server_fd, client_fd[MAX_CLIENTS];
struct sockaddr_in server_addr, client_addr;
socklen_t client_len;
char buffer[BUFFER_SIZE];
fd_set read_fds;
int max_fd, activity, i, valread, sd;
// 创建server socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 绑定地址和端口
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(8888);
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听连接
if (listen(server_fd, MAX_CLIENTS) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
// 初始化client_fd数组
for (i = 0; i < MAX_CLIENTS; i++) {
client_fd[i] = 0;
}
while (1) {
// 清空文件描述符集合
FD_ZERO(&read_fds);
// 添加标准输入和server socket到集合中
FD_SET(STDIN_FILENO, &read_fds);
FD_SET(server_fd, &read_fds);
max_fd = server_fd;
// 添加所有已连接的client socket到集合中
for (i = 0; i < MAX_CLIENTS; i++) {
sd = client_fd[i];
if (sd > 0) {
FD_SET(sd, &read_fds);
}
if (sd > max_fd) {
max_fd = sd;
}
}
// 等待事件发生
activity = select(max_fd + 1, &read_fds, NULL, NULL, NULL);
if (activity < 0) {
perror("select error");
continue;
}
// 如果标准输入有数据可读
if (FD_ISSET(STDIN_FILENO, &read_fds)) {
fgets(buffer, BUFFER_SIZE, stdin);
printf("stdin data: %s\n", buffer);
}
// 如果server socket有新连接请求
if (FD_ISSET(server_fd, &read_fds)) {
client_len = sizeof(client_addr);
client_fd[i] = accept(server_fd, (struct sockaddr*)&client_addr, &client_len);
if (client_fd[i] < 0) {
perror("accept failed");
continue;
}
printf("New connection, socket fd: %d, ip: %s, port: %d\n", client_fd[i],
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
}
// 如果有client socket有数据可读
for (i = 0; i < MAX_CLIENTS; i++) {
sd = client_fd[i];
if (FD_ISSET(sd, &read_fds)) {
valread = read(sd, buffer, BUFFER_SIZE);
if (valread == 0) {
// client关闭连接
printf("Client disconnected, socket fd: %d\n", sd);
close(sd);
client_fd[i] = 0;
} else {
// 处理client数据
printf("Data received: %s\n", buffer);
}
}
}
}
return 0;
}
```
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)