如果我有这些结构:
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从其他类访问其成员作为成员变量.我想弄清楚如何做到这一点.
在 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) 我有一个关于带签名的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,但这有保证吗?
我正在将代码从 boost 1.67 移植到 boost 1.74 (debian buster->bullseye)。
\n当我编译时我得到:
\nIn 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 | ^~~~~~~~~~~~~~~~~~~~\nRun Code Online (Sandbox Code Playgroud)\n我知道标头已被弃用。我很高兴改变
\n#include …Run Code Online (Sandbox Code Playgroud) 如果我有以下行。然后我希望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()默认情况下不将该选项设置为默认值吗?
我创建了一个 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) 我有一个超级项目,其中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并没有真正起作用,因为我的父存储库或中间存储库中的文件夹结构的深度是任意的,因此您无法使用该命令可靠地过滤掉外部内容。
我想用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.我如何添加bar到all配方?
我试过添加add_dependency(foo bar),但是foo不存在的目标.如果有一些超级目标,我不知道那将是完美的.然后我可以使用它作为我的自定义命令的TARGET而不是打扰bar.
我习惯使用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.
我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_WRITE并GROUP_WRITE适用于var/log但不适用var.目前我需要sudo chmod 777 var让我的程序运行.我怎么能纠正这个?