小编Ste*_*art的帖子

通过更高级别的结构访问子变量

如果我有这些结构:

typedef struct { int x; } foo;
typedef struct { foo f; } bar;
Run Code Online (Sandbox Code Playgroud)

通常你会获得x通过b.f.x,但有一种方法来设置此,以便您可以访问元素x没有提及f

bar b;
b.x = ...
Run Code Online (Sandbox Code Playgroud)

我的第一个直觉是你不能,因为如果两个子结构都有一个成员x并且我无法弄清楚编译错误是什么,那么就有可能发生名称冲突.但是,我记得在一些可行的框架中工作.

在C++中,我曾在一个bar存在的框架中工作,并且您可以this->x从其他类访问其成员作为成员变量.我想弄清楚如何做到这一点.

c c++

16
推荐指数
3
解决办法
880
查看次数

在 Debian 上的 CMake 中查找 GeographicLib

在 Debian 上,我已经安装了 cmake 和 geoliblib,如下所示:

stew@stewbian:~$apt-get install build-essential cmake libgeographic-dev
Run Code Online (Sandbox Code Playgroud)

我的 CMakeLists.txt 文件如下所示:

cmake_minimum_required(VERSION 3.7)
project(geoexample)

find_package(GeographicLib REQUIRED)

add_executable(geoexample main.cpp)

target_include_directories(geoexample PRIVATE ${GeographicLib_INCLUDE_DIRS})
target_compile_definitions(geoexample PRIVATE ${GeographicLib_DEFINITIONS})
target_link_libraries     (geoexample         ${GeographicLib_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

我的main.cpp也很简单(直接取自示例):

#include <iostream>
#include <GeographicLib/Geodesic.hpp>
using namespace std;
using namespace GeographicLib;
int main() {
    const Geodesic& geod = Geodesic::WGS84();
    // Distance from JFK to LHR
    double
      lat1 = 40.6, lon1 = -73.8, // JFK Airport
      lat2 = 51.6, lon2 = -0.5;  // LHR Airport
    double s12;
    geod.Inverse(lat1, lon1, lat2, lon2, …
Run Code Online (Sandbox Code Playgroud)

cmake geographic-lib

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

从std :: round转换为int是否安全?

我有一个关于带签名的std :: round的问题:double round (double x);

假设我有这段代码:

int i = std::round(0.9);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,std::round应该返回1.00000000000,但这是令人不安的接近0.9999999999999,我担心浮点错误将最终四舍五入.

我希望如此i == 1,但这有保证吗?

c++ floating-point rounding

8
推荐指数
3
解决办法
2003
查看次数

如何静默内部升压已弃用的消息

我正在将代码从 boost 1.67 移植到 boost 1.74 (debian buster->bullseye)。

\n

当我编译时我得到:

\n
In file included from /usr/include/boost/config/header_deprecated.hpp:18,\n                 from /usr/include/boost/detail/no_exceptions_support.hpp:15,\n                 from /usr/include/boost/msm/back/state_machine.hpp:20,\n                 from /home/stew/mycode.cpp:3:\n/usr/include/boost/detail/no_exceptions_support.hpp:17:1: note: \xe2\x80\x98#pragma message: This header is deprecated. Use <boost/core/no_exceptions_support.hpp> instead.\xe2\x80\x99\n   17 | BOOST_HEADER_DEPRECATED("<boost/core/no_exceptions_support.hpp>")\n      | ^~~~~~~~~~~~~~~~~~~~~~~\n/usr/include/boost/bind.hpp:36:1: note: \xe2\x80\x98#pragma message: The practice of declaring the Bind placeholders (_1, _2, ...) in the global namespace is deprecated. Please use <boost/bind/bind.hpp> + using namespace boost::placeholders, or define BOOST_BIND_GLOBAL_PLACEHOLDERS to retain the current behavior.\xe2\x80\x99\n   36 | BOOST_PRAGMA_MESSAGE(\n      | ^~~~~~~~~~~~~~~~~~~~\n
Run Code Online (Sandbox Code Playgroud)\n

我知道标头已被弃用。我很高兴改变

\n
#include …
Run Code Online (Sandbox Code Playgroud)

c++ boost

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

CMAKE 选项的默认值不起作用

如果我有以下行。然后我希望TEST_OPTION被设置ON为默认。

option( TEST_OPTION "A test option" ON)
Run Code Online (Sandbox Code Playgroud)

当我测试它时,它似乎不是ON默认的。为了测试,我正在编译一个简单的应用程序:

int main() {

  #ifdef TEST_OPTION
    #error "TEST_OPTION encountered"
  #endif 
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我还有一个简单的 CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)
project(test)

add_executable(test main.cpp)

option( TEST_OPTION "A test option" ON)

if(TEST_OPTION)
  target_compile_definitions(test PRIVATE TEST_OPTION)
endif(TEST_OPTION)
Run Code Online (Sandbox Code Playgroud)

如果我尝试使用 进行编译$ cmake && cmake --build .,我预计会遇到编译错误,但我没有!如果我替换option( TEST_OPTION ... )set(TEST_OPTION ON),那么我会得到我预期的编译错误。

有人可以解释为什么option()默认情况下不将该选项设置为默认值吗?

cmake

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

将旧的 git 历史记录添加到新存储库

我创建了一个 git 存储库并向其中提交了内容。

git clone git://newrepo.com/project.git # Empty repository
tar -xzvf project-0.6.tar.gz -C project     # Fill it with tar contents
cd project
git commit -a
... Do work
... Commit
... Push
Run Code Online (Sandbox Code Playgroud)

但后来发现了带有 git 历史记录的同一项目的恢复版本,是用早期版本的 tar.gz 制作的。

如何将旧项目的历史记录导入到新项目中?


我想我需要做这样的事情:

git clone git://newrepo.com/project.git                 # Start fresh
cp -r project project_backup                            # Backup the content
cd project                               
git init                                                # Wipe everything
git remote set-url origin git://oldrepo.com/project.git # Point to the old project
git pull                                                # Get clean history
cp -r ../project_backup …
Run Code Online (Sandbox Code Playgroud)

git

6
推荐指数
2
解决办法
2372
查看次数

避免 SVN 递归检查外部

我有一个超级项目,其中svn:externals还有其他几个项目。他们,反过来又svn:external是他们自己的依赖者。我的问题之一是我的依赖项通常依赖于相同的svn:external(公共库),这导致大量重复的签出和构建。

当我签出或更新我的主项目时,我想签出我的直接外部,但忽略它们的外部。我想我可以在 svn 属性中设置它,但我还没有弄清楚如何设置。我会想象这样的事情:

$ svn propset svn:externals -r25 http://svn.example.com/foo/trunk foo --ignore-externals
Subcommand 'propset' doesn't accept option '--ignore-externals'
Type 'svn help propset' for usage.
Run Code Online (Sandbox Code Playgroud)

还有其他方法可以避免检查外部的外部吗? --depth并没有真正起作用,因为我的父存储库或中间存储库中的文件夹结构的深度是任意的,因此您无法使用该命令可靠地过滤掉外部内容。

svn svn-externals

5
推荐指数
0
解决办法
414
查看次数

默认情况下在CMake中构建自定义目标

我想用cmake运行自定义命令.这听起来像一个非常简单的任务/问题,但令人沮丧的是找到一个例子是多么困难.

这是我正在尝试做的事情:

$ cmake .
$ make
> Hello World! (Output)
Run Code Online (Sandbox Code Playgroud)

在Gnu中,这非常容易:

bar: 
        echo Hello World!
Run Code Online (Sandbox Code Playgroud)

但我正试图在cmake中这样做.基于我一直在阅读的内容,我应该能够使用以下CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.6)
project(foo)
add_custom_target(bar)
add_custom_command(
  TARGET   bar
  COMMAND  "echo Hello World!"
)
Run Code Online (Sandbox Code Playgroud)

如果我打电话,目前没有工作要做make.我需要明确地打电话make bar.我如何添加barall配方?

我试过添加add_dependency(foo bar),但是foo不存在的目标.如果有一些超级目标,我不知道那将是完美的.然后我可以使用它作为我的自定义命令的TARGET而不是打扰bar.

cmake

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

如何将boost :: asio :: tcp :: io_stream附加到我的io_service?

我习惯使用boost::asio::ip::tcp::sockets来构建它们io_service.这很有用,因为我有一个单独io_service的所有套接字,这些套接字共享一个线程池.

现在,我正在尝试使用a boost::asio::ip::tcp::io_stream,我希望它在同一个线程池中执行所有异步工作.但是,似乎不可能用外部构造一个.底层套接字确实使用内部初始化的io_service.有我的方式继续使用我的集中管理有?tcp::io_streamio_serviceio_servicetcp::io_stream

我正在使用boost版本1.62.

c++ boost asio

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

安装时不应用CMake WORLD_WRITE权限

CMakeLists.txt通过执行以下操作从a安装一个空目录:

file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/var/log)

install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/var
        DESTINATION ${CMAKE_INSTALL_PREFIX}
        DIRECTORY_PERMISSIONS
          OWNER_WRITE OWNER_READ OWNER_EXECUTE
          GROUP_WRITE GROUP_READ GROUP_EXECUTE
          WORLD_WRITE WORLD_READ WORLD_EXECUTE
        COMPONENT runtime
       )
Run Code Online (Sandbox Code Playgroud)

我希望看到这些权限:

/opt/myapp $ ls -l
drwxrwxrwx root root var
drwxrwxrwx root root var/log
Run Code Online (Sandbox Code Playgroud)

但相反,我看到:

/opt/myapp $ ls -l
drwxr-xr-x root root var
drwxrwxrwx root root var/log
Run Code Online (Sandbox Code Playgroud)

DIRECTORY_PERMISSIONS WORLD_WRITEGROUP_WRITE适用于var/log但不适用var.目前我需要sudo chmod 777 var让我的程序运行.我怎么能纠正这个?

install cmake

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

标签 统计

c++ ×4

cmake ×4

boost ×2

asio ×1

c ×1

floating-point ×1

geographic-lib ×1

git ×1

install ×1

rounding ×1

svn ×1

svn-externals ×1