小编Kil*_*zor的帖子

在assert中添加自定义消息?

有没有办法添加或编辑断言抛出的消息?我想用类似的东西

assert(a == b, "A must be equal to B");
Run Code Online (Sandbox Code Playgroud)

然后,编译器添加,时间等...

可能吗?

c++ assert

114
推荐指数
5
解决办法
6万
查看次数

CMake:如何传递预处理器宏

如何将宏传递给预处理器?例如,如果我想是因为用户想要编写单元测试编译我的代码一些部分,我这样做:

#ifdef _COMPILE_UNIT_TESTS_
    BLA BLA
#endif //_COMPILE_UNIT_TESTS_
Run Code Online (Sandbox Code Playgroud)

现在我需要将此值从CMake传递给预处理器.设置变量不起作用,那么我该如何实现呢?

c++ cmake

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

在哪里放置第三方库来设置c ++ linux开发环境?

我不是C++的新手,尽管我是Linux新手.我正在使用CMake与一些第三方预编译一个跨平台的游戏引擎,但我对使用库有很多疑问.我的问题是如何与第三方图书馆合作.在哪里放这个库.Apt在他们的官方位置安装libs(/ usr/local,/ usr/lib/..)但我使用本地库中的本地库在我的项目目录中开发.

另外,我需要一个很好的教程来了解库的工作原理.例如:当试图编译我的项目时,luabind通过liblua.s0.1询问,但是AFAIK没有办法用lua提供的源生成这个库(至少做make,make install).

我知道,这个问题很模糊,但我没有足够的经验来更简洁.

更新:阅读sombe答案后,更简洁的问题如下.如果我安装所有第三方库,我该如何分发我的程序?如何在不使用大型自述文件的情况下管理家属?

感谢所有强文

c++ linux libraries

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

如何通过Google测试获取断言?

我正在使用Google测试框架编写一些单元测试.但我想检查一些断言是否放置得很好并且有用.有没有办法在Google测试中捕获断言?

测试中的示例代码:

int factorial(int n){
    assert(n >= 0);
    //....
}
Run Code Online (Sandbox Code Playgroud)

然后测试:

#include <gtest/gtest.h>
TEST(FactorialTest,assertNegative){
    EXPECT_ANY_THROW({
         factorial(-1);
    });
}
Run Code Online (Sandbox Code Playgroud)

但是EXPECT_ANY_THROW没有抓住断言但只有例外.我正在寻找一个捕获断言的解决方案.

c++ unit-testing googletest assertions

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

在Google测试中将多个文件中的测试用例分开

我是谷歌测试C++框架的新手.它很容易使用,但我想知道如何将案例分成多个测试文件.什么是最好的方法?

直接包含.cpp文件是一个选项.使用标题似乎什么都不做......

欢迎任何帮助

c++ googletest

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

跨不同命名空间的朋友类.那可能吗

我在尝试使用C++的好友功能时遇到了问题.我有这些接口:

#pragma once
#include "Mesh3D.h"
#include <string>
namespace tools{
    namespace sysInput{
        class CGeometryManager3D
        {
        public:
            bool loadFromFile(render::CMesh3D& mesh, std::string filename);
            CGeometryManager3D(void);
            ~CGeometryManager3D(void);
        };

    };

};
Run Code Online (Sandbox Code Playgroud)

#pragma once
#include "GeometryManager.h"

class CGeometryManager3D;
namespace render{

    class CMesh3D
    {
    public:
        friend class tools::sysInput::CGeometryManager3D;
        CMesh3D(void);
        ~CMesh3D(void);
    };

};
Run Code Online (Sandbox Code Playgroud)

我不知道发生了什么,但编译器抛出了很多错误(Visual C++ 2008).有可能解决这个问题吗?

编辑:上面的代码是一个模拟代码来显示我的问题.您的解决方案适用于此代码,但是当我在实际代码中实践时,无效.真正的代码几乎是一样的:

#ifndef _ZELESTE_IO_GEOMETRY_MANAGER_H_
#define _ZELESTE_IO_GEOMETRY_MANAGER_H_

#include "ResourceLocationManager.h"
#include <string>
#include "../../render/C3DMesh.h"


namespace tools{
    namespace sysInput{ 
        class CGeometryManager
        {
        private:
            CGeometryManager(void);
            ~CGeometryManager(void);
            static CGeometryManager* m_instance;
        public:
            static CGeometryManager* getInstance();
            bool load3DGeometryFromFile(render::C3DMesh* …
Run Code Online (Sandbox Code Playgroud)

c++ namespaces friend

21
推荐指数
1
解决办法
2万
查看次数

在docker-compose中安装卷.怎么做?

如果我在控制台中执行此cmd:

 docker run -it --rm --link rabbit --link elasticsearch -v "$PWD"/logstash:/config-dir logstash logstash -f /config-dir/logstash.conf
Run Code Online (Sandbox Code Playgroud)

它运行正常.在./logstash文件夹里面有一个logstash.conf.但现在我正试图插入一个docker-compose并且同样不起作用:

  logstash:
  image: logstash:latest
  links:
    - "elasticsearch:elasticsearch"
    - "rabbit:rabbit"
  volumes:
      - $PWD/logstash:/config_dir
  command:
    - "-f /config_dir/logstash.conf"
Run Code Online (Sandbox Code Playgroud)

但我看不出两个命令之间的区别.一些帮助?如何完成卷装?或者命令不起作用?logstash init的响应是:

logstash_1        | {:timestamp=>"2016-07-06T15:43:06.663000+0000", :message=>"No config files found: / /config_dir/logstash.conf\nCan you make sure this path is a logstash config file?", :level=>:error}
rabbitmq_logstash_1 exited with code 1
Run Code Online (Sandbox Code Playgroud)

编辑:我终于通过删除命令并使用原始图像的默认命令解决了问题,但我仍然不明白问题以及如何将相同的命令传递给docker并且工作但是如果它通过docker-compose传递别.提前致谢

docker dockerfile docker-compose

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

如何防止宏重新定义

在我的项目上工作了一段时间后,这个警告开始出现:

2>Game.cpp
2>c:\program files\microsoft sdks\windows\v6.0a\include\windef.h(126) : warning C4005: 'APIENTRY' : redefinición de macro
2>        c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(72) : vea la definición anterior de 'APIENTRY'
2>c:\program files\microsoft sdks\windows\v6.0a\include\wingdi.h(23) : warning C4005: 'WINGDIAPI' : redefinición de macro
2>        c:\users\ferran\directo\gameprojects\dev-libs\glfw\include\glfw.h(88) : vea la definición anterior de 'WINGDIAPI'
Run Code Online (Sandbox Code Playgroud)

我确定这是要解决的包含文件的顺序问题,因为这些文件都不是我的.我的问题是,是否存在一种通用的方法来防止这种情况或找到必须重新排序的文件以避免此消息.

c++ macros visual-studio

15
推荐指数
3
解决办法
4万
查看次数

cmake DEFINED似乎不承认变量

我在cmake中有这个代码:

#mandatory
SET(BOOST_DIR "$ENV{BOOST_HOME}")
if (DEFINED ${BOOST_DIR})
    #global include directories
    include_directories(${BOOST_DIR})
else(DEFINED ${BOOST_DIR})
    message( STATUS "BOOST_HOME at ${BOOST_DIR}")

    message( FATAL_ERROR "Undefined BOOST_HOME env var.")
endif(DEFINED ${BOOST_DIR})
Run Code Online (Sandbox Code Playgroud)

定义了env var BOOST_HOME(/ home/ferran/boost).行为很奇怪,因为输出是:

-- BOOST_HOME at /home/ferran/boost
CMake Error at CMakeLists.txt:14 (message):
  Undefined BOOST_HOME env var.


-- Configuring incomplete, errors occurred!
Run Code Online (Sandbox Code Playgroud)

因此,var存在并打印其内容并且同时不存在?

cmake

14
推荐指数
1
解决办法
2万
查看次数

在windows + opengl中选择一个图形设备

我知道如何用openGL打开一个窗口(使用Win32或其他工具包).但是当系统有2个显卡时.如何选择要渲染的图形设备?我的编程语言是C++,我专注于Windows,但欢迎任何样本.

编辑:也许更好地解释我的问题是一个好主意,为了增加一些观点:我的新笔记本电脑有两张图形卡.集成的Intel HD和GeForce GT 540M.英特尔卡大部分时间用于渲染SO,因为它可以节省电池电量.当游戏开始时,GeForce会自动启动.该系统被nvidia称为"optimus"(http://www.nvidia.com/object/optimus_technology.html).问题是当我启动我的应用程序时,检测到的de opengl驱动程序是2.1而供应商是Intel,我不知道如何切换到其他设备.

最后我找到了这个信息.如果你没有使用nvidia,那就没用了,但我把它交给任何能阅读的人http://developer.download.nvidia.com/compute/cuda/3_2/toolkit/docs/CUDA_Developer_Guide_for_Optimus_Platforms.pdf

c++ opengl winapi

13
推荐指数
2
解决办法
8774
查看次数