小编Ric*_*den的帖子

如何使用Emacs Lisp检查文件是否存在?

我希望emacs标记在打开时以只读方式生成的文件.我遗漏的部分难题是如何检查文件是否"存在".我目前有以下内容:

;;
;; get file extension
;;
(defun get-ext (file-name)
  (car (cdr (split-string file-name "\\."))))

;; 
;; get the base name of the file
;;
(defun base-name (file-name)
  (car (split-string file-name "\\.")))

;;
;; if an 'lzz' file exists for this header, mark it as read only
;;
(defun mark-read-only ()
  (if (string= (get-ext (cur-file)) "h")
      (if ( ??file-exists??? (concat (base-name (cur-file)) ".lzz") )
          (toggle-read-only))))
Run Code Online (Sandbox Code Playgroud)

我可以用什么来"??? file-exists ???"?

一旦我找到了这个,我就会在适当的钩子上添加"mark-read-only"(我认为是find-file-hook).

背景

我们使用lzz作为代码生成器来简化我们的C/C++开发过程.简而言之,lzz采用单个输入文件(看起来非常像C/C++)并根据需要生成头文件和源文件.

默认情况下,LZZ包括#line指令,使调试器指向原始源,而不是生成的源代码,但为了减小编译依赖我们通常禁用头文件这些指令.结果是,在调试模板或内联函数时,调试器通常指向生成的头文件而不是原始源文件.

这不是什么大问题,但是,最近我发现在调试时我会快速修改显示的文件,然后我会重建.当然,这通常意味着我所做的更改会因为我编辑的文件生成而消失,因此在库重建期间更改会被"吹走".

感谢大家的帮助和评论.特别感谢cobbal指出要使用的正确功能.

这是生成的代码(此处也基于其他评论进行更新): …

emacs elisp

66
推荐指数
3
解决办法
2万
查看次数

评估HDF5:HDF5为数据建模提供了哪些限制/特性?

我们正在评估我们将用于存储我们在分析C/C++代码期间收集的数据的技术.在C++的情况下,数据量可能相对较大,每TU约20Mb.

阅读以下SO 答案后,我认为HDF5可能是我们使用的合适技术.我想知道这里的人是否可以帮我回答一些我提出的初步问题:

  1. 性能.数据的一般用法是一次写入并读"几次",类似于编译器生成的'.o'文件的生命周期.HDF5如何与使用像SQLite DB这样的东西进行比较?这甚至是一个合理的比较吗?

  2. 随着时间的推移,我们将添加我们正在存储的信息,但不一定要重新分发一组全新的"读者"以支持新格式.在阅读用户指南后,我了解到HDF5与XML或DB类似,因为信息与标签/列相关联,因此构建用于读取旧结构的工具只会忽略它不关心的字段?我对此的理解是否正确?

  3. 我们希望写出的一大部分信息将是树类型的结构:范围层次结构,类型层次结构等.理想情况下,我们会将范围建模为具有父项,子项等.是否可以将一个HDF5对象设为"点"到另一个?如果没有,是否有使用HDF5解决此问题的标准技术?或者,根据数据库的要求,我们是否需要一个唯一的密钥,在搜索数据时,将一个对象"链接"到另一个对象并进行适当的查找?

非常感谢!

database binaryfiles hdf5 datamodel

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

何时使用'typeid'是最佳解决方案?

有很多理由不使用typeid.除了使用type_info(实现定义的行为)的成员之外,通常(总是?)可以使用其他C++语言特性提供类似的功能,例如:重载,虚函数等.

因此,排除依赖于实现定义行为的使用情况,是否有人拥有真实世界的示例哪个typeid是最佳解决方案?

c++ typeid

28
推荐指数
4
解决办法
7909
查看次数

如何最好地将std :: vector <std :: string>容器写入HDF5数据集?

给定一个字符串向量,将它们写入HDF5数据集的最佳方法是什么?目前我做的事情如下:

  const unsigned int MaxStrLength = 512;

  struct TempContainer {
    char string[MaxStrLength];
  };

  void writeVector (hid_t group, std::vector<std::string> const & v)
  {
    //
    // Firstly copy the contents of the vector into a temporary container
    std::vector<TempContainer> tc;
    for (std::vector<std::string>::const_iterator i = v.begin ()
                                              , end = v.end ()
      ; i != end
      ; ++i)
    {
      TempContainer t;
      strncpy (t.string, i->c_str (), MaxStrLength);
      tc.push_back (t);
    }


    //
    // Write the temporary container to a dataset
    hsize_t     dims[] = { tc.size () …
Run Code Online (Sandbox Code Playgroud)

c++ stl hdf5

15
推荐指数
2
解决办法
8877
查看次数

什么是函数__tcf_0?(使用gprof和g ++时看到)

我们使用g ++ 4.2.4,我试图在我的代码中追踪一些性能问题.

我正在运行gprof来生成配置文件,我得到以下"奇怪",因为最昂贵的功能是__tcf_0:

Each sample counts as 0.01 seconds.
 %   cumulative   self              self     total           
time   seconds   seconds    calls  ms/call  ms/call  name    
40.00      0.04     0.04        1    40.00    95.00  __tcf_0
Run Code Online (Sandbox Code Playgroud)

然后,此函数似乎调用了我的大多数用户函数(即,它是从main调用的函数).我在这里找到的最接近的解释是在这里,但该链接指的是静态对象和atexit,我不认为这适用于我的情况.

如果它有用,我正在使用Boost(program_options和fusion)和HDF5库.

更新:

我在构建时使用的命令是:

g++  -Wreturn-type -Wunused -Winline -pg  -DLINUX -DHAS_SETENV \
    -DFUSION_MAX_MAP_SIZE=15 -DFUSION_MAX_VECTOR_SIZE=15  -g -O0 \
    --param large-function-growth=300 --param inline-unit-growth=200
Run Code Online (Sandbox Code Playgroud)

c++ g++ gprof

8
推荐指数
2
解决办法
1940
查看次数

在vc2010中为地图值类型创建指向成员的指针

我们将代码移植到VC++的旧版本2010中有一个问题.

问题是通过地图的在VC执行,这导致在派生到基本转换的引起pointer-to-membernon-type-argument被要求:

#include <map>
#include <algorithm>

template <typename MapValueType, int MapValueType::*var>
bool f (MapValueType const & v);

int main ()
{
  typedef std :: map<int, int> MapType;
  MapType m;
  std :: find_if (m.begin ()
      , m.end ()
      , f<MapType::value_type, & MapType::value_type::second> );
}
Run Code Online (Sandbox Code Playgroud)

生成以下消息:

从指针到基础成员到派生指针到成员的标准转换不适用于模板参数file.cc(x):错误C2973:'f':无效模板参数'int std :: _ Pair_base <_Ty1, _Ty2> ::*'

所以似乎value_typein 的实现std::map具有基类中的对.

关于如何解决这个任何想法保持pointer-to-member为一个non-type-argument

是我们改变结构,使唯一的选择ffunctor用一个成员pointer-to-member

c++ visual-c++

8
推荐指数
1
解决办法
279
查看次数

在emacs中使用gdb -i = mi集成24

我在我们的一个应用程序中检查了一个段错误.启动应用程序后不久,主gdb状态栏将变为:

(调试器:运行[signal-received])

一个(gdb)提示出现,但所有其他窗口的内容保持不变(空).在提示符下键入任何内容都不会产生任何影响 - gdb似乎是悬挂.使用完整且正确的回溯command line在预期输出中对结果执行相同的步骤gdb.

这与我第一次调试-i=mi之间的集成emacsgdb.我正在使用emacs24.2和gdb7.5.

有关如何进一步调试的建议吗?

是否有可能降低整合水平?这会让我确定导致问题的区域吗?

最后一点是应用程序的初始加载大约需要70秒,相比之下大约需要3秒command line.

emacs gdb

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

我可以让gdb跳过函数末尾的throw语句吗?

当我调试时,我有时发现"重放"最后几个代码语句很有用.例如:

void foo (int & i) {
  i = 0;
  ++i;
  i++;
}
Run Code Online (Sandbox Code Playgroud)

通过调试器运行时,您可以在函数体的顶部添加断点,然后从内部的任何语句中添加:foo如果键入:"jump file.cc:2",调试器将返回到i = 0.我很欣赏这并不总是完美的,但有时它足以找到你正在寻找的bug.

我正在调查导致异常被抛出的问题.异常被抛出在被调用函数的底部,所以类似于:

void bar ()
{
  throw int ();
}

void foo (int & i)
{
  i = 0;
  ++i;

  bar ();

  i++;
}

int main ()
{
  try
  {
    int i;
    foo (i);
  }
  catch (...)
  {
  }
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是,在之前设置一个断点throw int (),然后跳过那个语句,完成功能栏 - 这样我就可以跳回到i = 0foo中的那一行.

有没有办法可以跳过throw int (),或者在bar没有执行throw语句的情况下完成?

问题似乎是之后没有任何声明,throw …

debugging gdb

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

便携式捕获信号并向用户报告问题的方法

如果由于某些奇迹在我们的程序中发生了段错误,我想要捕获SIGSEGV并让用户(可能是GUI客户端)知道一个返回码,发生了严重的问题.同时我想在命令行上显示信息以显示捕获的信号.

今天我们的信号处理程序如下:

void catchSignal (int reason) {
  std :: cerr << "Caught a signal: " << reason << std::endl;
  exit (1);
}
Run Code Online (Sandbox Code Playgroud)

我可以听到上面的恐怖尖叫声,正如我从这个帖子中读到的那样,从信号处理程序中调用一个不可重入的函数是邪恶的.

是否有便携式方式处理信号并向用户提供信息?

编辑:或至少在POSIX框架内可移植?

c c++ posix signals reentrancy

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

标签 统计

c++ ×5

emacs ×2

gdb ×2

hdf5 ×2

binaryfiles ×1

c ×1

database ×1

datamodel ×1

debugging ×1

elisp ×1

g++ ×1

gprof ×1

posix ×1

reentrancy ×1

signals ×1

stl ×1

typeid ×1

visual-c++ ×1