我有一个声明如此的方法:
/*!
\brief Removes the leading and trailing white space from a string.
\param s The string to remove the white space from.
\param white_chars Characters to be considered as whitespace.
*/
std::string Trim(const std::string &s, const std::string &white_chars = " \t\n\r");
Run Code Online (Sandbox Code Playgroud)
该方法的定义是无趣的,但无论如何它在这里:
std::string Trim(const std::string &s, const std::string &white_chars)
{
size_t startidx = s.find_first_not_of(white_chars);
if (startidx == std::string::npos) return "";
size_t endidx = s.find_last_not_of(white_chars);
return s.substr(startidx, endidx - startidx + 1);
}
Run Code Online (Sandbox Code Playgroud)
现在在这种方法的大多数用法中,我只提供了第一个参数.Valgrind给了我以下警告
==3338== 68 bytes in 2 blocks …
Run Code Online (Sandbox Code Playgroud) 我使用Windows上的Microsoft Visual Studio和uBuntu Linux上的GCC开发C++交叉平台.
在Visual Studio中,我可以在我的代码中使用像" π "和" ² " 这样的unicode符号.Visual Studio始终将源文件保存为带有BOM(字节顺序标记)的UTF-8.
例如:
// A = ?.r²
double ? = 3.14;
Run Code Online (Sandbox Code Playgroud)
只有在我首先删除BOM时,GCC才会愉快地编译这些文件.如果我不删除BOM,我会收到以下错误:
wwga_hydutils.cpp:28:9:错误:在程序中迷路'\ 317'
wwga_hydutils.cpp:28:9:错误:在程序中迷失'\ 200'
这让我想到了这个问题:
有没有办法让GCC编译UTF-8文件而不先删除BOM?
我正在使用:
和:
编辑:
正如第一个评论者指出的那样,我的问题不是 BOM,而是在字符串常量之外使用非ascii字符.GCC不喜欢符号名称中的非ascii字符,但事实证明GCC与带有BOM的UTF-8完全兼容.
背景:
许多年前,我继承了一个使用Visual Studio(VC++)标志'/ fp:fast'的代码库,以在特定的计算重量库中生成更快的代码.不幸的是,'/ fp:fast'产生的结果与不同编译器(Borland C++)下的同一个库略有不同.当我们需要产生完全相同的结果时,我切换到'/ fp:precise',这很好,从那以后一切都很好.但是,现在我在uBuntu Linux 10.04上用g ++编译同一个库,我看到了类似的行为,我想知道它是否有类似的根本原因.我的g ++构建的数值结果与我的VC++构建的数值结果略有不同.这让我想到了我的问题:
题:
g ++与VC++中的'fp:fast'和'fp:precise'选项有相同或相似的参数吗?(它们是什么?我想激活'fp:precise'等价物.)
更详细的信息:
我使用'make'编译,它调用g ++.据我所知(make文件有点神秘,而且不是我写的)g +调用中添加的唯一参数是"普通"(包括文件夹和要编译的文件)和-fPIC(我不确定这个开关是做什么的,我没有在'man'页面上看到它.
'man g ++'中唯一相关的参数似乎是用于打开优化选项.(例如-funsafe-math-optimizations).但是,我认为我没有打开任何东西,我只是想关闭相关的优化.
我已经尝试过发布和调试版本,VC++为发布和调试提供了相同的结果,g ++给出了与发布和调试相同的结果,但是我不能让g ++版本给出与VC++版本相同的结果.
c++ g++ compiler-optimization visual-studio-2008 ubuntu-10.04
在我的HTML源代码中,我有一个代码块,如下所示(我在本页面上使用showdown和highlight.js):
<pre><code class="cpp">
double myNumber = (double)4;
</code></pre>
Run Code Online (Sandbox Code Playgroud)
我的问题是第一个换行符仍然是"代码"块的一部分.这可能是因为封闭的"pre"块,但我需要它,因为highlight.js期望它(显然HTML5标准推荐它).代码呈现如下(注意前导换行符):
所以我的问题是,使用css,javascript或jquery,如何从像这样的"代码"块中删除前导或尾随换行?
我目前正在使用CppUnit进行测试,但由于缺乏对类别概念的支持而感到沮丧.有没有广泛使用的C++单元测试框架支持这个想法?
以下是直接来自NUnit文档的示例:
namespace NUnit.Tests
{
using System;
using NUnit.Framework;
[TestFixture]
[Category("LongRunning")]
public class LongRunningTests
{
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
我们的想法是能够将测试分组到不同的类别中,并在指定的类别中执行测试,或者根据类别排除测试.
我尝试过CppUnit,Boost.Test和Google Test,但没有一个直接支持这个想法.
例如,我有单元测试,集成测试,中等测试和大型测试.单元和集成测试运行得很快,所以我在自动构建中的每个构建配置中运行它们:Release/Debug,x86/x64,linux/windows.中等测试需要时间来运行,所以我只在Release | x64 | windows build中运行它们.大型测试作为开发辅助工具存在:它们永远不会在自动构建中运行.然后为了增加乐趣,我的功能只存在于x86 | windows中(它很复杂).我用复杂的层次结构完成所有这些,CppUnit很乐意支持.但是,使用"release","debug","x86"等类别进行此操作会更好.
在CppUnit中,我的测试目前在Fixture类中.理想情况下,我希望能够使用类别标记这些灯具,然后我可以相应地进行过滤.
测试层次结构不做的一个关键事情是,哪个类别可以做,就是在一个夹具上有多个类别.
在Microsoft Visual C++中,在winnt.h中定义了一个名为MAXDWORD的常量,如下所示:
#define MAXDWORD 0xffffffff
当搜索集合中的最低值时,它对于'double'的高初始值很有用.谷歌虽然我可能,我在Linux上找不到标准标题中的等价物,但我愿意打赌必须有一个.
我正在使用:
以下粗略代码基于文档,给出了boost中提供的计时器对象所用的经过时间(以秒为单位).
boost::timer::cpu_timer timer;
// ...do some work...
const boost::timer::nanosecond_type oneSecond(1000000000LL);
return timer.elapsed().user / oneSecond;
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于我的代码中有这个令人不舒服的幻数.在boost中是否有一些方法可以让我在调用elapsed().user时可用的nanosecond_type值中经过几秒钟,而没有在我的代码中使用这个神奇的数字?
(编辑:)结论:
根据接受的答案,我最终在我的生产代码中使用了这个片段:
boost::timer::cpu_timer timer;
// ...do some work...
auto nanoseconds = boost::chrono::nanoseconds(timer.elapsed().user + timer.elapsed().system);
auto seconds = boost::chrono::duration_cast<boost::chrono::seconds>(nanoseconds);
std::cout << seconds.count() << std::endl;
Run Code Online (Sandbox Code Playgroud) 关于如何注册自定义 URL 方案(例如这个)有许多堆栈溢出问题。然而,在每种情况下的答案似乎都是写入特权注册表项HKEY_CLASSES_ROOT
。我的(基于 wix 的)安装程序目前在没有提升的情况下运行,按用户安装。有什么方法可以在不提升到管理员权限的情况下注册自定义 URL 方案?我不需要支持比 Windows 7 更旧的任何东西。
我想要实现的是在我的应用程序中执行特定操作的网页上有链接。我的应用程序主要是 .NET。该网页是 ASP.NET。
我使用 GIT 作为 Ubuntu Linux 上自动构建过程的一部分。因为它是一个自动化的构建过程,所以最好将所有配置都放在版本控制中,这样我就不必在配置更改时登录每个构建代理。
为了使其正常工作,我有一个私钥(具有只读存储库访问权限)和一个签入版本控制的known_hosts 文件。
我将 HOME 环境变量设置为版本控制中的某个位置 (build/ssh_home),以便允许 GIT 找到我的known_hosts 文件 (build/ssh_home/.ssh/known_hosts)。
我使用以下命令“激活”私钥并从 GIT 中提取私钥。“git clone”步骤类似。
ssh-agent bash -c "echo $HOME; ssh-add '${deploymentKey}' >/dev/null 2>&1; git pull ${repository} --quiet"
Run Code Online (Sandbox Code Playgroud)
这适用于 Windows。然而,在 Ubuntu Linux 上,这还不够。
“HOME”环境变量设置如下(在 bash 脚本中)
export HOME=`pwd`/build/ssh_home
Run Code Online (Sandbox Code Playgroud)
但是,它显然没有使用正确的known_hosts 文件,它仍在尝试使用 ~/.ssh/known_hosts 中的文件,下面消息中引用的路径证明了这一点。
The authenticity of host 'bitbucket.org (131.103.20.168)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of …
Run Code Online (Sandbox Code Playgroud) c++ ×5
g++ ×2
boost ×1
chm ×1
constants ×1
css ×1
gcc ×1
git ×1
html ×1
installation ×1
javascript ×1
jquery ×1
linux ×1
markdown ×1
memory-leaks ×1
pdf ×1
ssh ×1
stdstring ×1
ubuntu ×1
ubuntu-10.04 ×1
unit-testing ×1
url ×1
utf-8 ×1
valgrind ×1
wix ×1