小编use*_*672的帖子

重新定义__LINE__和__FILE__常量

我正在为c ++制作内存泄漏检测器.它取代了全球新的运营商,并使用宏来初始化两个全局变量,__file__并且__line__,像这样:

#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
Run Code Online (Sandbox Code Playgroud)

我从另一个名字我不记得的StackOverflow用户那里学到了这个技巧.这适用于涉及new的简单操作,但是当用户为命名空间定义新的本地运算符时,此appraoch会导致问题.一方面,线条像

void* operator new(size_t size);
Run Code Online (Sandbox Code Playgroud)

也与宏相匹配; 同样,显式调用全局new,如:

int* i = ::new int;
Run Code Online (Sandbox Code Playgroud)

导致语法错误.

有没有办法在部分代码中重新定义或抑制__LINE____FILE__常量(以便它们显示对operator new的调用的文件名和行号)?如果没有,如何改进宏以不匹配用户定义的"operator new"并且不会导致":: new"出现问题?

我真的很想摆脱宏的怪癖.提前致谢 :)

c++ macros gcc

6
推荐指数
1
解决办法
1327
查看次数

在Clang的措辞中,什么是"annonated fallthrough"和"部分注释方法"?

我正在将Clang错误消息翻译成另一种语言,并且在文件底部附近我找到了以下条目:

def warn_unannotated_fallthrough : Warning<
  "unannotated fall-through between switch labels">,
  InGroup<ImplicitFallthrough>, DefaultIgnore;
Run Code Online (Sandbox Code Playgroud)

def warn_unannotated_fallthrough_per_function : Warning<
  "unannotated fall-through between switch labels in partly-annotated "
  "function">, InGroup<ImplicitFallthroughPerFunction>, DefaultIgnore;
Run Code Online (Sandbox Code Playgroud)

我试图搜索这些警告的提及,并发现此代码snipplet:

int fallthrough(int n) {
   switch (n / 10) {
     case 0:
       n += 100;
-    case 1:  // expected-warning{{unannotated fall-through between switch labels in partly annotated method}} expected-note{{insert '[[clang::fallthrough]];' to silence this warning}} expected-note{{insert 'break;' to avoid fall-through}}
+    case 1:  // expected-warning{{unannotated fall-through}} expected-note{{insert '[[clang::fallthrough]];' to silence this warning}} expected-note{{insert …
Run Code Online (Sandbox Code Playgroud)

c c++ clang

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

需要帮助了解Owicki-Gries方法

我(错误地)选择了关于验证并发程序的课程,到目前为止我们已经介绍了这种称为"Owicki-Gries方法"的方法.显然,通过将断言与每个语句相关联,可以证明关于程序的各种结果,并且显示这些断言是归纳的并且不会相互干扰.我们的任务之一涉及Lamports的快速互斥算法,详见本文:

在论文中,给出了Owicki-Gries风格的互斥证明.它看起来完全反直觉.我很难理解的是如何首先提出这些断言?你何时知道这些断言既不是太强大(如此强大以至于它打破了干扰自由),也不是太弱(例如一些微不足道的东西,比如每个陈述的重言式)?

干杯

formal-verification theorem-proving

5
推荐指数
1
解决办法
333
查看次数

这可能与printf有关吗?

据我所知,使用超大字符串,您可以打印出前几个字符:

printf(".5s\n",string);
Run Code Online (Sandbox Code Playgroud)

并且使用小尺寸字符串,您可以用空格填充它:

printf("% 5s\n",string);
Run Code Online (Sandbox Code Playgroud)

有没有办法同时实现这两个目标?即如果它很短,请用0或空格填充它,如果它很长则截断它?

c printf libc

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

extern"C"---当*正好*使用?

如果您想将此问题标记为重复,请注意我已经阅读了有关此主题的问题,但我仍然不清楚.我的印象是,当包含C头并使用C代码链接时使用此构造(如果我错了,请纠正我).这是否意味着在不处理目标文件时我永远不必使用"extern C"?如果我错了,为什么旧​​C代码不能编译为C++,因为它最有可能是合法的c ++代码?

我对它有点不确定因为我发誓我在使用C++中的旧C 源代码时遇到过这种情况,其中链接器错误仅通过"extern C"解决,并且库头确实有

#ifdef __cplusplus
#extern "C"{
#endif
//......
#ifdef _cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

在他们旁边.

编辑:很抱歉不清楚,但我想问的是,只有在包含C头并链接到预先存在的C对象文件时才需要"extern C"吗?如果它是真的,(并且它似乎从下面的评论来判断),为什么库标题周围有"extern C"子句,为什么它们不能被包含并编译为C++?

c++

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

将整数除以3的简便方法

我正在开发一个项目,即在FPGA上制作一个简单的音乐播放器.它从PC获取指定格式的音乐文件,并在循环中大声播放.

我们需要实现标准音符长度,即半个节拍的Quaver,2个节拍的Minim等.目前我们在不同的BPM值下有一个节拍长度表的时钟周期数.我们需要将它们乘以这些音符长度以产生正确的时钟周期.唯一的问题是Tuplet,这是一个完整节拍的三分之一.

如果没有实现完整的分频器电路,是否有任何数学技巧可以将大约3的整数除以?

boolean-logic circuit vhdl

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