标签: c++

什么是STL?

我不是C++程序员,很难理解网站上给出的解释.我不了解容器或迭代器,也没有计划在不久的将来学习C++.所以用外行人的话说:什么是STL,它能为我做什么?它与Python标准库或glibc相比如何?

c++ stl

24
推荐指数
3
解决办法
1万
查看次数

C中的Python式整数除法和模数

在Python和Ruby中,带符号的整数除法向负无穷大截断,有符号整数模数与第二个操作数具有相同的符号:

>>> (-41) / 3
-14
>>> (-41) % 3
1
Run Code Online (Sandbox Code Playgroud)

但是,在C和Java中,带符号的整数除法截断为0,有符号整数模数与第一个操作数的符号相同:

printf("%d\n", (-41) / 3); /* prints "-13" */
printf("%d\n", (-41) % 3); /* prints "-2" */
Run Code Online (Sandbox Code Playgroud)

在C和Python中执行相同类型的除法和模数的最简单,最有效的方法是什么?

c c++ java division modulo

24
推荐指数
2
解决办法
7912
查看次数

使用向后兼容的使用Boost的ABI创建库

我正在研究某个C++库(或更多框架).我想让它向后兼容以前的版本,不仅保留了API兼容性,还保留了ABI(就像Qt那样出色的工作).

我使用Boost的许多功能,对我来说,这使得向后兼容性变得不可能,除非我强迫用户拥有完全相同(有时是旧版本)的B​​oost.

有没有办法(没有重写1/2 Boost)在其命名空间周围做一些"前缀"/重命名它以防止它干扰用户版本的Boost?

例如,我的libXYZ使用Boost 1.33并且它有类boost::foo.在版本1.35 boost::foo升级并添加了新成员,因此,boost::foo从1.33和1.35不兼容ABI.因此,libXYZ的用户必须使用Boost 1.33或使用Boost 1.35重新编译libXYZ(可能已经以XYZ无法编译的方式破坏了某些API).

注意:我说的是带有ELF的UNIX/Linux操作系统,其中动态链接类似于静态链接,因此您无法链接两个不同版本的库,因为符号会产生干扰.

我可能想到的一个合适的解决方案是将Boost放在其他一些私有命名空间中.因此,libXYZ将使用::XYZ::boost::foo而不是::boost::foo.这可以防止与用户可能使用的其他版本的Boost冲突.

因此,libXYZ将继续使用Boost 1.33与其他命名空间静态或动态链接,假设它:

  • 不会暴露Boost API.
  • 将保持稳定的私有版本的公开API.

有没有办法用Boost做这些事情?

编辑:最后我决定创建一个脚本,将源中的所有boost符号重命名为某个自定义符号.

基本原理:构建过程的简化,独立于编译器可见性支持,它的可见性仅适用于动态库,对于静态,这不起作用,因此我需要为每种类型的库提供单独的构建和依赖.

该脚本可在那里找到:http://art-blog.no-ip.info/files/rename.py

编辑2:最新版本的Boost BCP支持命名空间重命名.

c++ unix compatibility boost abi

24
推荐指数
2
解决办法
6673
查看次数

C++ - 构造类中的对象

我对C++很新,我不确定这个.看看下面的例子总结了我当前的问题.

class Foo
{
    //stuff
};

class Bar
{
    Foo foo;
};
Run Code Online (Sandbox Code Playgroud)

因此Bar会保留一个完整的Foo对象,而不仅仅是一个引用或指针.此对象是否由其默认构造函数初始化?我是否需要显式调用其构造函数,如果是,请问如何以及在何处?

谢谢.

c++ oop constructor

24
推荐指数
3
解决办法
6万
查看次数

整洁的异步IO代码

虽然异步IO(带有select/poll/epoll/kqueue等的非阻塞描述符)并不是Web上记录最多的东西,但有一些很好的例子.

但是,所有这些示例在确定了调用返回的句柄后,只有一个do_some_io(fd)"存根".它们并没有真正解释如何在这种方法中最好地接近实际的异步IO.

阻止IO非常整洁,直接读取代码.另一方面,非阻塞,异步IO是毛茸茸的,凌乱的.

有什么办法?什么是健壮和可读的?

void do_some_io(int fd) {
  switch(state) {
    case STEP1:
       ... async calls
       if(io_would_block)
          return;
       state = STEP2;
    case STEP2:
       ... more async calls
       if(io_would_block)
          return;
       state = STEP3;
    case STEP3:
       ...
  }
}
Run Code Online (Sandbox Code Playgroud)

或者(ab)使用GCC的计算得到的:

#define concatentate(x,y) x##y
#define async_read_xx(var,bytes,line)       \
   concatentate(jmp,line):                  \
   if(!do_async_read(bytes,&var)) {         \
       schedule(EPOLLIN);                   \
       jmp_read = &&concatentate(jmp,line); \
       return;                              \
}

// macros for making async code read like sync code
#define async_read(var,bytes) \
    async_read_xx(var,bytes,__LINE__)

#define async_resume()            \
     if(jmp_read) {               \
         void* …
Run Code Online (Sandbox Code Playgroud)

c c++ io asynchronous

24
推荐指数
2
解决办法
3万
查看次数

"Fun"C++库,用于解释代码中的ASCII数字 - 它叫什么?("多维模拟文字")

前段时间我偶然发现了一个C++ gem,一组通过运算符重载和可能的预处理器技巧的类,让你使用代码中的ASCII艺术来定义变量:

Line x = |-----|;    //x is 5
Line y = |---|;      //y is 3

Rectangle r = +---+
              |   |
              +---+; //r is 3 by 1
Run Code Online (Sandbox Code Playgroud)

和IIRC,它甚至支持3D数字!

但是对于我的生活,我不记得这个库/头文件/类集的名称.这叫什么?

c++ ascii-art

24
推荐指数
1
解决办法
2864
查看次数

cout或printf这两者中的哪一个具有更快的执行速度C++?

我用C++编写了很长时间.我总是想知道哪个执行速度更快printf或者cout

情况:我正在用C++设计一个应用程序,我有一些约束,比如执行时间限制.我的应用程序在控制台上加载打印命令.那么哪一个更好printf或者cout

c++

24
推荐指数
5
解决办法
2万
查看次数

为什么我不能使用fopen?

在上一个问题的模型中,我询问了所谓的安全库折旧,我发现自己同样对于为什么fopen()应该被弃用感到困惑.

该函数接受两个C字符串,并返回FILE*ptr,或者在失败时返回NULL.线程安全问题/字符串溢出问题在哪里?或者是别的什么?

提前致谢

c c++ deprecated tr24731

24
推荐指数
3
解决办法
2万
查看次数

如何更改可执行文件的属性?(视窗)

当我创建.exe时,我可以右键单击它并转到属性 - >详细信息.然后我得到一个列表,如:

File Description | 
Type             | Application
File Version     | 
Product Name     | 
Product Version  |
Copyright        | 
Size             | 18.0 KB
Date Modified    | 6/16/2009 8:23 PM
Language         |
Run Code Online (Sandbox Code Playgroud)

如何更改这些属性?(另外,有没有办法改变图标?)

c++ windows executable exe properties

24
推荐指数
4
解决办法
6万
查看次数

gprof报告没有时间积累

我正在尝试在运行OSX 10.5.7的计算机上使用gprof配置C++应用程序.我以通常的方式使用g ++编译,但是使用-pg标志,运行应用程序并尝试使用gprof查看调用图.

不幸的是,我的调用图包含所有时间列的全零."被调用"列中的值具有合理的值,因此看起来有些内容被分析但我对其他数据的缺乏感到困惑.

我的所有源文件都以类似的方式编译:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o  ScenarioLoader.o ScenarioLoader.cpp
Run Code Online (Sandbox Code Playgroud)

然后我运行'ar'将所有目标文件捆绑到一个库中.后来,我链接并运行gprof如下:

g++ -pg -lm  -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o
./vrpalone
gprof gmon.out | less
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c++ unix macos gprof

24
推荐指数
4
解决办法
2万
查看次数