Articles of c ++ 11

使用unique_ptr来控制文件描述符

理论上,我应该能够使用自定义的指针types和删除器,以使unique_ptrpipe理不是指针的对象。 我试了下面的代码: #ifndef UNIQUE_FD_H #define UNIQUE_FD_H #include <memory> #include <unistd.h> struct unique_fd_deleter { typedef int pointer; // Internal type is a pointer void operator()( int fd ) { close(fd); } }; typedef std::unique_ptr<int, unique_fd_deleter> unique_fd; #endif // UNIQUE_FD_H 这是行不通的(gcc 4.7和-std = c ++ 11参数)。 它回应以下错误: In file included from /usr/include/c++/4.7/memory:86:0, from test.cc:6: /usr/include/c++/4.7/bits/unique_ptr.h: In instantiation […]

如何在centos6上分发c ++ 11共享库

我有一个C ++ 11库( https://github.com/matiu2/cdnalizer )。 我想分发到centos6和ubuntu12.04 LTS。 它在Ubuntu 13.10和Gentoo上愉快地编译。 我尝试尽可能多的静态编译,但它仍然取决于centos没有的glibc: matiu@matiu-laptop:~/projects/cdnalizer/build/src/apache$ readelf -d mod_cdnalizer.so | grep NEED 0x0000000000000001 (NEEDED) Shared library: [libapr-1.so.0] 0x0000000000000001 (NEEDED) Shared library: [libstdc++.so.6] 0x0000000000000001 (NEEDED) Shared library: [libgcc_s.so.1] 0x0000000000000001 (NEEDED) Shared library: [libc.so.6] 0x000000006ffffffe (VERNEED) 0xd520 0x000000006fffffff (VERNEEDNUM) 3 build造线: /usr/bin/g++ -fPIC -I/usr/local/include -I/usr/include -I/usr/include/x86_64-linux-gnu -I/usr/include/x86_64-linux-gnu/c++/4.8 -Wall -Wextra -g -shared -Wl,-soname,mod_cdnalizer.so […]

如何编写写入/ var / log / myapp目录的C / C ++应用程序?

背景 在Linux系统上, 应用程序日志存在于/var/log子目录中,该root/root由root/root拥有,在我的系统上拥有755个权限。 例如,我看到/var/log/mysql和/var/log/samba 。 题 如果我想让一个myapp能够写入/var/log/myapp ,在C / C ++中完成此操作的规范方式是什么? 思考 如果我不想sudo a_setup_script.sh我必须像setuid root那样做一些疯狂的sudo a_setup_script.sh吗? 请注意,我知道syslog例程,但它们不足以满足我的需要(我需要logging更多的信息,分成不同的文件,因此需要子目录)。 我是否需要查看一下Ubuntu打包(设置目录)和将文件IO直接导入子目录(通过myapp )? 我想尽可能遵循标准。 附录 我忘了提及, myapp实际上是一个守护进程(一个监听客户端的服务器),所以如果有一个myapp_user实际运行/启动进程,那么这个进程并不是那么糟糕。 回答 对于Ubuntu,最好的解决scheme似乎是rsyslog ,这是一个function强大,现代化的syslog替代品。 它将根据需要生成文件/目录,它具有用于灵活路由syslog条目的内置语言,并且在C / C ++级别使用简单的旧syslog API。 要存储路由信息,您可以在C / C ++中定义自己的文本消息编码,并配合正确的rsyslog.conf来处理解码。

C ++ 11:g ++ – 4.7内部编译错误

以下代码: #include <iostream> #include <array> using namespace std; constexpr int N = 1000000; constexpr int f(int x) { return x*2; } typedef array<int, N> A; template<int… i> struct F { static constexpr A f() { return A{{ ::f(i)… }}; } }; template<class A, class B> struct C {}; template<int… i, int… j> struct C<F<i…>, F<j…>> […]

为什么使用std :: thread :: hardware_concurrency()和boost :: thread :: hardware_concurrency()有区别?

问题本身的描述非常简单。 我正在testing在C + + 11和boost ::线程库的std ::线程库的差异。 这些输出: #include <iostream> #include <thread> #include <boost/thread.hpp> int main() { std::cout << std::thread::hardware_concurrency() << std::endl; std::cout << boost::thread::hardware_concurrency() << std::endl; return 0; } 给了我不同的结果: 0 4 这是为什么? PS:gcc软件包的版本是4.6.2-1.fc16(x86_64)。 我在用着 g++ test.cc -Wall -std=c++0x -lboost_thread-mt -lpthread

链接/运行时不同GCC版本的风险?

我使用的是英特尔的C ++编译器,它在Linux上依赖于GNU提供的libc.so和libstdc ++。 这是我的问题。 要访问一些最新的C ++ 11function,我需要使用GCC 4.7或更高版本附带的libstdc ++。 但我坚持使用CentOS 6.4。 在CentOS 6.4上,GCC的本地版本是4.4。 但是使用名为“SCL”的RedHat和名为“devtoolset-1.1”的软件包,我可以在“/ opt”下安装GCC 4.7。 我以上述方式设置了使用GCC 4.7,我可以使用更新的C ++ 11function。 所以这里是我的问题:如果用户运行我的程序只有libc.so / libstdc ++的GCC 4.4版本,所以在库path中,是否有风险,我的程序将有错误,由于4.4和4.7版本之间的不匹配那些图书馆? 如果有潜在的问题,我可以通过在GCC 4.7的libc和libstdc ++版本中静态链接来解决这个问题吗? 或者,如果/当我的代码dynamic加载的其他库select由系统范围的GCC 4.4包提供的较旧的libc / libstdc ++时,是否设置自己的其他问题?

Makefile c ++ 11支持

我最近用C ++开始了一个小项目。 我创build了一个简单的Makefile: CC=g++ CFLAGS =-std=c++0x -I. -c VPATH = src include vpath %.c src vpath %.h include TabooSearch : main.o Task.o TabooList.o $(CC) $(CFLAGS) -o TabooSearch main.o Task.o TabooList.o 问题是,当我运行make我得到这种错误forms的海湾合作委员会: error: 'nullptr' was not declared in this scope 我没有任何IDE我的Makefile有什么问题,有人可以帮我解决这个问题。 在Debian上,我的gcc版本是4.7.2 提前致谢

在linux上学习线程

Linux对我来说是一个新的平台。 我已经在Windows上用c ++编写了很多年,并且已经适应了该平台上的multithreading。 当我需要在Linux平台上学习c ++的时候,C ++ 11也随之而来。 Linux似乎大部分使用pthreads – 好的还有boost :: threads,QT也有自己的线程。 但是在C ++ 11中,std :: thread是一个全新的(跨平台和C ++标准)线程方式。 所以我想我将不得不学习pthreads和std :: threads。 最后,std :: thread似乎更重要,但是有很多遗留代码,所以我必须知道两者。 对于Windows上的线程同步,我将使用WaitForMultipleObjects等待一些任务完成,然后继续进一步的工作。 pthread是否存在类似的同步机制? 的std ::线程? 我看了一下pthread_join ,它似乎有一次只能在一个线程上等待的function。 我是否错过了另一个pthread调用?

在Matlab mex文件中编译c ++ 11代码时出错

我已经下载了下面的代码 : CVPR 2014十字路口联合优化代码 cvpr2014-iou-code-1.0.zip http://research.microsoft.com/en-us/downloads/e164fe21-ef2b-4e34-98c1-4868968abb06/ 我得到的是两个文件夹,一个叫src/ ,另一个叫matlab/ 。 我正在运行Linux Fedora 19,我可以在src/编译代码src/很好。 当我尝试在matlab/编译代码时出现问题。 自述文件说: Matlab compilation —————— From within Matlab, configure the compiler using "mex -setup", then adjust the paths in matlab\compile_windows.m or matlab/compile_linux.m scripts and run either "compile_linux.m" or "compile_windows.m" in the "matlab" directory. 对于Linux更具体: Linux ===== From within Matlab run "mex -setup", then […]

使用CUDA 6.0的C ++ 11标准

我想在我的CUDA 6.0项目中为我的C ++文件使用C ++ 11标准。 当我将CUDA 6.0 Nsight Eclipse设置中的编译器更改为g ++并添加-std=c++11选项时,我收到了很多像这样的错误: error: namespace "std::__gnu_cxx" has no member "__normal_iterator" 显然,我必须为CUDA“select”一次编译器,然后再select我的C ++文件。 我该怎么做? 安装支持未公开的C ++ 11的CUDA 6.5不是一个选项。