我希望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指出要使用的正确功能.
这是生成的代码(此处也基于其他评论进行更新): …
我们正在评估我们将用于存储我们在分析C/C++代码期间收集的数据的技术.在C++的情况下,数据量可能相对较大,每TU约20Mb.
阅读以下SO 答案后,我认为HDF5可能是我们使用的合适技术.我想知道这里的人是否可以帮我回答一些我提出的初步问题:
性能.数据的一般用法是一次写入并读"几次",类似于编译器生成的'.o'文件的生命周期.HDF5如何与使用像SQLite DB这样的东西进行比较?这甚至是一个合理的比较吗?
随着时间的推移,我们将添加我们正在存储的信息,但不一定要重新分发一组全新的"读者"以支持新格式.在阅读用户指南后,我了解到HDF5与XML或DB类似,因为信息与标签/列相关联,因此构建用于读取旧结构的工具只会忽略它不关心的字段?我对此的理解是否正确?
我们希望写出的一大部分信息将是树类型的结构:范围层次结构,类型层次结构等.理想情况下,我们会将范围建模为具有父项,子项等.是否可以将一个HDF5对象设为"点"到另一个?如果没有,是否有使用HDF5解决此问题的标准技术?或者,根据数据库的要求,我们是否需要一个唯一的密钥,在搜索数据时,将一个对象"链接"到另一个对象并进行适当的查找?
非常感谢!
有很多理由不使用typeid
.除了使用type_info
(实现定义的行为)的成员之外,通常(总是?)可以使用其他C++语言特性提供类似的功能,例如:重载,虚函数等.
因此,排除依赖于实现定义行为的使用情况,是否有人拥有真实世界的示例哪个typeid
是最佳解决方案?
给定一个字符串向量,将它们写入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) 我们使用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) 我们将代码移植到VC++的旧版本2010中有一个问题.
问题是通过地图的在VC执行,这导致在派生到基本转换的引起pointer-to-member
在non-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_type
in 的实现std::map
具有基类中的对.
关于如何解决这个任何想法和保持pointer-to-member
为一个non-type-argument
?
是我们改变结构,使唯一的选择f
是functor
用一个成员pointer-to-member
?
我在我们的一个应用程序中检查了一个段错误.启动应用程序后不久,主gdb
状态栏将变为:
(调试器:运行[signal-received])
一个(gdb)
提示出现,但所有其他窗口的内容保持不变(空).在提示符下键入任何内容都不会产生任何影响 - gdb
似乎是悬挂.使用完整且正确的回溯command line
在预期输出中对结果执行相同的步骤gdb
.
这与我第一次调试-i=mi
之间的集成emacs
和gdb
.我正在使用emacs
24.2和gdb
7.5.
有关如何进一步调试的建议吗?
是否有可能降低整合水平?这会让我确定导致问题的区域吗?
最后一点是应用程序的初始加载大约需要70秒,相比之下大约需要3秒command line
.
当我调试时,我有时发现"重放"最后几个代码语句很有用.例如:
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 = 0
foo中的那一行.
有没有办法可以跳过throw int ()
,或者在bar
没有执行throw语句的情况下完成?
问题似乎是之后没有任何声明,throw …
如果由于某些奇迹在我们的程序中发生了段错误,我想要捕获SIGSEGV并让用户(可能是GUI客户端)知道一个返回码,发生了严重的问题.同时我想在命令行上显示信息以显示捕获的信号.
今天我们的信号处理程序如下:
void catchSignal (int reason) {
std :: cerr << "Caught a signal: " << reason << std::endl;
exit (1);
}
Run Code Online (Sandbox Code Playgroud)
我可以听到上面的恐怖尖叫声,正如我从这个帖子中读到的那样,从信号处理程序中调用一个不可重入的函数是邪恶的.
是否有便携式方式处理信号并向用户提供信息?
编辑:或至少在POSIX框架内可移植?