GCC4.8使用regex坑
背景
最近在写C++的webserver,其中的有一块需要用到正则表达式,而系统centos7自带的GCC编译器的版本gcc 版本 4.8.5,在make编译时候出现std::regex_error::regex_error
,一开始怀疑正则问题,使用网页版的正则表达式工具review确实是正确的,后面有在思考是否为编译器版本问题,强大的搜索引擎告诉我确实为版本的原因,regex标准库需要GCC大于等于4.9版本。
最近在写C++的webserver,其中的有一块需要用到正则表达式,而系统centos7自带的GCC编译器的版本gcc 版本 4.8.5,在make编译时候出现std::regex_error::regex_error
,一开始怀疑正则问题,使用网页版的正则表达式工具review确实是正确的,后面有在思考是否为编译器版本问题,强大的搜索引擎告诉我确实为版本的原因,regex标准库需要GCC大于等于4.9版本。
最近使用C++网络编程,计划实现一个web服务(模拟http请求、支持host模式)。刚接触犯了一个低级的通信错误,导致Transport endpoint is not connected。
在server端accept一个新的连接后返回一个文件描述符(这里就叫connect_fd),但这个文件描述符有区别于初始化socket的listen_fd文件描述符。在read函数的时候错误将listen_fd传入到函数中,最终导致Transport endpoint is not connected错误。
# read读取数据过程
while(true){
if((nread = read(connect_fd, ptr, nleft)) < 0){
}
}
# accept函数 使用的是
int accept(int listen_fd, struct sockaddr *cliaddr, socklen_t *addrlen);
操作系统的进程空间有用户态和系统态,它们具有不同的执行权限。系统调用是指运行在用户态的进程向操作系统内核态请求获得更高的运行权限而能够受限访问硬件设备(比如CPU、打印机)。
当发生系统调用时,CPU通过软中断切换到内核态开始执行内核系统调用函数。
最近在学习C++知识,记录下一些常考的知识点。
sizeof空类为1,是为了确保两个不同对象的地址的不同。
#include<iostream>
using namespace std;
class Empty{};
int main(){
# 输出为1
cout << sizeof(Empty) << endl;
return 0;
}
不管包含有多少个虚函数,只有一个虚指针vptr的大小。
#include<iostream>
using namespace std;
class VirtualFunction{
virtual void funtion1();
virtual void funtion2();
virtual void funtion3();
};
int main(){
# 输出为8
cout << sizeof(VirtualFunction) << endl;
return 0;
}
# 形式如下
类型名 *函数名(函数参数列表)
# 示例代码
// 由于“*”的优先级低于“()”的优先级,因而swap首先和后面的“()”结合,也就意味着,swap是一个函数 char *swap(char *a, char *b) 等价于 char *(swap(char *a, char *b))
// 返回值是一个指针地址。
#include <stdio.h>
char *swap(char *a, char *b){
b = a;
return b;
}
int main(int argc, char *argv[]) {
char a[10] = "hello";
char b[10] = "world";
printf("%s", swap(a, b));
return 0;
}