使用命令行工具输出没有最后一行的文件的所有行的最佳方法是什么?
例:
$ cat foo.txt
a b c
v w x y z
a sd dsgdfg
$ some-cmd foo.txt
a b c
v w x y z
Run Code Online (Sandbox Code Playgroud) 我从g ++中得到一个奇怪的编译器错误.
std::plus is not a function对于以下代码,它说" ",即使我没有包含<functional>,我也没有使用std错误发生的地方.
这是代码:
#include <iostream>
template<class T1, class T2, class T3>
struct MyStruct {
T1 t1; T2 t2; T3 t3;
MyStruct() {}
MyStruct(T1 const& t1_, T2 const& t2_, T3 const& t3_)
: t1(t1_), t2(t2_), t3(t3_) {}
};
template<class T1, class T2, class T3>
MyStruct<T1, T2, T3> plus(MyStruct<T1, T2, T3> const& x,
MyStruct<T1, T2, T3> const& y) {
// ...
}
int main() {
typedef MyStruct<int, double, std::string> Struct;
Struct …Run Code Online (Sandbox Code Playgroud) 我对C/C++不了解的是:
是的,每个人都使用它来获得超快速的可执行文件,因此它们会在启用优化的情况下进行编译.
但是对于打开调试信息的编译,我们并不关心速度.那么为什么不在该编译模式中包含更多信息,例如在它们发生之前检测一些段错误?实际上,assert(ptr != NULL)在每次访问指针之前插入一个ptr.为什么编译器不能这样做?同样,默认情况下应该关闭,但我认为应该有这种可能性.
编辑:有些人说,我建议的检测没有意义或没有做任何报告segmentation fault不会做的事情.但我想到的只是一个更优雅和信息丰富的中止,它打印出违规代码的文件名和行号,就像一样assert().
这是一个小SVN问题:
我在本地创建一个目录:
$ svn mkdir output
A output
Run Code Online (Sandbox Code Playgroud)
我不小心删除了它:
rm -rf output
Run Code Online (Sandbox Code Playgroud)
现在,我该如何重新创建它?我试过这个:
$ svn mkdir output
svn: 'output' is already under version control
Run Code Online (Sandbox Code Playgroud)
还有这个:
$ svn revert output
Reverted 'output'
Run Code Online (Sandbox Code Playgroud)
但它仍然不存在.
更新:人们建议mkdir output删除后应该已经足够了.但在我的SVN版本中并非如此.它忽略了一个事实,output/.svn即我也删除了一个目录.mkdir output当然,只是不会把那个带回去.所以,不知何故,SVN必须参与该output 目录的重新创建.(我正在使用SVN 1.4.6.)
我有这样的代码,我发现它有点难以阅读:
// code1
if( (expensiveOperation1() && otherOperation() && foo())
|| (expensiveOperation2() && bar() && baz()) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
我只是将其更改为以下内容,以使其更具可读性:
// code2
const bool expr1 = expensiveOperation1() && otherOperation() && foo();
const bool expr2 = expensiveOperation2() && bar() && baz();
if(expr1 || expr2){
// one of the conditions met
}
Run Code Online (Sandbox Code Playgroud)
但我现在应该关注效率吗?
我的意思是code1,如果第一个联合条款得到满足,那么它甚至不会费心去看第二个,因为已经清楚该陈述是真的.
但是,在我更可读的示例中,cond1并cond2必须计算.或者编译器是否足够聪明,如果expr2没有在其他任何地方使用,我可以将其更改code2为code1?
有没有办法告诉编译器(在我的情况下是g ++)不优化某些代码,即使该代码不可访问?我只想在目标文件中使用这些符号.
示例:这是一个简单的函数,我确实希望编译该函数,即使它从未被调用过.
void foo(){
Foo<int> v;
}
Run Code Online (Sandbox Code Playgroud)
如果没有正式的编译器指令,是否有一个技巧可以让编译器认为它是一个重要的函数?或者至少让它认为它不能被安全地忽略?我试过这样的事情:
extern bool bar;
void foo(){
if(bar){
Foo<int> v;
}
}
Run Code Online (Sandbox Code Playgroud)
但那似乎并没有这样做.
(如果你真的想知道为什么我在地球上会想要那个 - 它与这个问题有关,而不是显式的模板实例化template class Foo<int>我只是想能够写Foo<int> v,因为在很多情况下这更容易,因为它隐含地实例化所需的所有函数,它在没有优化的情况下在调试模式下工作正常......)
更新:
这是我想要做的(作为一个可编辑的迷你示例):
foo.h(这些文件是给我的,不可更改)
template<class T>
struct Foo {
T val_;
Foo(T val) : val_(val) {
// heavy code, long compile times
}
};
Run Code Online (Sandbox Code Playgroud)
FOO-instantiation.cpp
#include "foo.h"
void neverCalled() {
Foo<int> f(1);
}
// The standard way to instantiate it is this:
// template class Foo<int>; …Run Code Online (Sandbox Code Playgroud) 有时,当我查看我的头文件时,我想在(doxygen)文档中添加一些内容.这可能是关于使用某些函数参数的快速说明,或者只是修复一点错字.
但后来我想:哦,不,这会在下次make通话时触发重新编译!对于某些基本标题,整个项目将重新编译,这可能需要很长时间.所以,没关系!
有这种困境的解决方案吗?是否存在不直接在头文件中记录函数/类的方法?或者是否有(计划)聪明的人make会注意到只有一些评论已经改变,但是不需要重新编译?
这是一个非常基本的C++设计问题:
一旦构造了对象,我有一个包含一些只读数据的类:
class Foo {
private:
class Impl;
Impl* impl_;
public:
int get(int i); // access internal data elements
};
Run Code Online (Sandbox Code Playgroud)
现在,我想实现几种方法来构造一个Foo对象并用数据填充它:from std::istream,from iterator,vector等.实现它的最佳方法是什么?
我可以直接添加所有这些构造函数Foo,但我真的不希望Foo用户必须包含std::istream等等.我也担心包含太多代码的类.
最常用的方法是什么?我想,添加一些私有addElement函数,然后定义Foo通过读取数据创建对象,调用addElement并返回构造对象的友元工厂函数?还有其他选择吗?
考虑以下一小段代码:
// all of these include other headers, lots of code:
#include "myheader1.h"
#include "myheader2.h"
#include <string>
void foo() {
string s("hello world"); // oh no, why does this compile??
}
Run Code Online (Sandbox Code Playgroud)
这个编译,显然一些递归包含的头文件有一个
using namespace std;
Run Code Online (Sandbox Code Playgroud)
某处.您将如何找到违规代码行的位置?
只是grep在所有头文件上使用都不会真正起作用,因为该语句通常在函数内部使用,它是安全的并且不会污染其余的代码.
我有一个std::map,我想定义一个返回修改值的迭代器.通常,std::map<int,double>::iterator迭代结束std::pair<int,double>,我想要相同的行为,只需将double值乘以常量.
我尝试过boost::transform_iterator,但它没有编译:
#include <map>
#include <boost/iterator/transform_iterator.hpp>
#include <boost/functional.hpp>
typedef std::map<int,double> Map;
Map m;
m[100] = 2.24;
typedef boost::binder2nd< std::multiplies<double> > Function;
typedef boost::transform_iterator<Function,
Map::value_type*> MultiplyIter;
MultiplyIter begin =
boost::make_transform_iterator(m.begin(),
Function(std::multiplies<double>(), 4));
// now want to similarly create an end iterator
// and then iterate over the modified map
Run Code Online (Sandbox Code Playgroud)
错误是:
error: conversion from 'boost
::transform_iterator<
boost::binder2nd<multiplies<double> >, gen_map<int, double>::iterator
, boost::use_default, boost::use_default
>' to non-scalar type 'boost::transform_iterator<
boost::binder2nd<multiplies<double> >, pair<const int, double> * …Run Code Online (Sandbox Code Playgroud) c++ ×8
optimization ×2
unix ×2
boost ×1
c ×1
constructor ×1
debugging ×1
directory ×1
function ×1
g++ ×1
header ×1
header-files ×1
iterator ×1
makefile ×1
mkdir ×1
namespaces ×1
performance ×1
shell ×1
svn ×1
templates ×1
text ×1