小编Lou*_*uen的帖子

禁用RTTI的dynamic_cast

我很想知道在使用动态强制转换RTTI禁用时(无论是-fno-rtti在GCC上还是/GR-在Visual Studio上)编译代码时会发生什么.编译器"退回"了static_cast吗?由于(至少在VS上)它只发出警告,编译的代码会做什么?

更具体地说,如果我在没有RTTI的情况下编译代码,那么可能会发生什么不好的事情我确信dynamic_cast没有错误(即dynamic_cast可以安全地替换为a static_cast),如下所示:

class A{ /*...*/ } ;
class B : public A {
    int foo() { return 42 ;}
} ;
//...
A * myA = new B() ;
int bar = (dynamic_cast<B*>(myA))->foo() ;
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-cast rtti

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

复杂的文字'i'用于函数参数

似乎有一个问题,使用C++中的文字istd::complex.

请考虑以下代码:

std::complex<double> a = -1.0i * 42.0;
std::complex<double> b = a + 1.0i;
Run Code Online (Sandbox Code Playgroud)

第二行无法编译: error: no match for ‘operator+’ (operand types are ‘std::complex<double>’ and ‘__complex__ double’)

在函数调用中使用复杂文字时也会出现这种情况,例如

std::exp<std::complex<double>>( 1.0i * 3.14159 );
Run Code Online (Sandbox Code Playgroud)

为什么复杂的字面值1.0i不能转换为std::complex<double>

我必须明确地构建一个std::complex1.0i

c++ std complex-numbers

20
推荐指数
1
解决办法
1151
查看次数

如何在程序停止之前使Visual Studio中断?

好的,我得到了这个多线程C++程序,我尝试在Visual Studio 2008中进行调试.

有时(通常在一到两个小时的计算之间的随机时间之后),程序停止,在调试窗口中写入后退出调试模式:

The thread 'Win32 Thread' (0x1560) has exited with code 3 (0x3).
The thread 'Win32 Thread' (0x5fc) has exited with code 3 (0x3).
...
Run Code Online (Sandbox Code Playgroud)

对于涉及的所有线程等等.

AFAIK退出代码3表示某事失败,我希望VS拦截异常并打破它,这样我就可以尝试查看错误是什么以及导致错误的原因.

我试图激活visual studio Debug菜单中的所有异常捕获,但它没有改变任何东西.

有没有办法告诉VS,当这个异常退出发生时,我想休息一下?

debugging visual-studio

9
推荐指数
1
解决办法
7046
查看次数

使用gdb调试动态加载的库

我正在尝试调试一个将动态库作为插件加载的应用程序,并遇到gdb问题以找到源文件并在源级别放置断点.

我构建了一个动态库(libFoo.so),它使用静态库(libBar.a)编译.

构建libFoo.so后,它将移动到我的主应用程序的plugins目录中,该目录位于不同的文件夹中.

在运行时,应用程序启动并查找此目录,然后加载libFoo.so.所有代码都使用调试信息构建,并为动态库正确加载调试信息.

令我困惑的是,源代码信息没有加载到libFoo的gdb中.这意味着当代码中断了libFoo函数时,我无法看到源代码list或设置断点.

但是,来自libBar的源代码信息(在libFoo.so中静态链接)是完全加载的,当从libBar破解代码并在libBar的代码中放置断点时我可以看到源代码...

更准确地说,这是gdb向我展示共享库的内容:

(gdb) info sharedlibrary Foo
From   To     Syms Read   Shared Object Library
0x...  0x...  Yes         /path/to/mainapp/plugins/libFoo.so
Run Code Online (Sandbox Code Playgroud)

好的,所以我的lib加载了调试符号.

(gdb) info sources
Source files for which symbols have been read in:
... 
/path/to/mainapp/src/main.cpp
/path/to/plugins/libs/bar/bar.cpp
...
Run Code Online (Sandbox Code Playgroud)

所以,gdb已正确加载源代码,libBar.a即使它与可执行文件位于不同的文件夹中,但不是来自与它一起构建的libFoo?

我也尝试在gdb中添加libFoowith 的源目录dir,但无济于事.

我在哪里可以看看帮助gdb建立libFoo与其源码之间的链接?我可以显式指定源文件(而不仅仅是目录dir)吗?还是有一些我缺少的选择?

c++ debugging dll gdb dynamic-library

8
推荐指数
0
解决办法
2992
查看次数

使用CMake只构建一次外部库

我的C++项目包括第三方库的源代码(目前作为git子模块).

这个库由我们的主要CMakelists通过使用添加到项目中add_subdirectory,然后库与主目标链接.

这是我当前的Cmake文件的简化版本:

add_subdirectory(foo)
set(FOO_LIBRARY ${CMAKE_CURRENT_SOURCE_DIR}/libfoo/libfoo.so)

add_executable(target main.cpp)
add_dependencies(target foo)
target_link_libraries(target ${FOO_LIBRARY})
Run Code Online (Sandbox Code Playgroud)

这个库需要很长时间才能构建,因为我没有更改它的代码,所以我只需要构建一次(每个构建配置).但是当我清理并重建我的代码时,它还会清理库文件并重新编译它们.

我试图CLEAN_NO_CUSTOM在库的目录中设置属性,但根据文档,它只适用于自定义命令目标.

在CMake中是否存在一种机制,通过该机制可以指定此库目标只需要生成一次,或者不需要清除make clean

c++ build cmake

7
推荐指数
2
解决办法
2406
查看次数

模板类的前向声明嵌套在模板类中

您可以在普通类中转发声明模板内部类,并将定义的类型用作任何其他前向声明的类型.

class Outer {
    template <int N> class Inner;
    typedef Inner<0> Inner0;
    Inner0* f();
};

template<int N>
class Outer::Inner {};
Run Code Online (Sandbox Code Playgroud)

现在如果Outer本身就是一个模板类,有没有办法将Inner的声明保持在Outer声明之外?就像是 :

template<typename T>
class Outer {
    template <int N> class Inner;
    typedef Inner<0> Inner0;
    Inner0* f();
};

template<typename T, int N> //This won't work
class Outer<T>::Inner {};
Run Code Online (Sandbox Code Playgroud)

是否有正确的语法来使用正确的模板参数声明Outer?

c++ templates nested

5
推荐指数
1
解决办法
1139
查看次数

GLSL 中统一浮点行为和常量浮点行为的不同

我正在尝试在 GLSL 中实现模拟双精度,并且观察到一种奇怪的行为差异,导致 GLSL 中出现细微的浮点错误。

考虑以下片段着色器,写入 4 浮点纹理以打印输出。

layout (location = 0) out vec4 Output
uniform float s;
void main()
{
  float a = 0.1f;
  float b = s;

  const float split = 8193.0; // = 2^13 + 1

  float ca = split * a;
  float cb = split * b;

  float v1a = ca - (ca - a);
  float v1b = cb - (cb - b);

  Output = vec4(a,b,v1a,v1b);
}
Run Code Online (Sandbox Code Playgroud)

这是我观察到的输出

统一的 GLSL 输出:

a = 0.1            0x3dcccccd
b …
Run Code Online (Sandbox Code Playgroud)

opengl floating-point precision shader glsl

5
推荐指数
1
解决办法
1949
查看次数

固定大小的容器到可变参数模板参数列表转换

我必须调用一个可变参数模板函数,它可以接受任意数量的参数.

template < class ... Args >
void f( Args&... args);
Run Code Online (Sandbox Code Playgroud)

我希望编写一个小的包装器函数,以便我可以调用f包含在固定大小容器(如std :: array)中的相同类型的N个参数.

目标是写出类似的东西

std::array<int, 3> arr = {1,2,3};
wrapper(arr); // calls f(1,2,3);
Run Code Online (Sandbox Code Playgroud)

我试图使用初始化列表的一些组合,std::forward但无济于事.有没有办法实现我想要的?

c++ variadic-templates c++11

4
推荐指数
1
解决办法
544
查看次数

C++模板参数默认函数实现

我有一组用作模板参数的类.它们都符合一些非正式的界面(又名概念)

template <typename T>
int func( T& t ) { return t.a() + t.b() + t.c(); }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我们说我使用FooBar作为参数实例化模板,因此他们必须实现方法a bc.

struct Foo { int a(); int b(); int c(); };
struct Bar { int a(); int b(); int c(); };
Run Code Online (Sandbox Code Playgroud)

现在,我有很多这样的类,我希望有一个函数的默认实现方式.

例如,我想c返回的区别a()b()默认.所以,我希望,这将是足够的,我定义a()b()c()作为将自动执行int c() { return a()- b();},而无需复制此代码的所有类.

我过去通过多态来实现这个结果(通过在基类中定义a()b()使用默认(虚拟)实现的纯虚函数c()),但出于性能原因,我放弃了这种机制.

我想知道是否有一个推荐的解决方案来获得这种结果(即使用我的模板参数类编写一次默认实现).

c++ templates c++-concepts

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