我正在使用GNU-make Makefile来构建一个包含多个目标(all和clean,以及一些项目特定目标)的C项目.在调试过程中,我想在没有永久编辑Makefile的情况下将一些标志附加到单个构建中(例如,添加调试符号或设置预处理器标志).
在过去,我做了如下(使用调试符号示例):
make target CFLAGS+=-g
Run Code Online (Sandbox Code Playgroud)
不幸的是,这并没有附加到CFLAGS变量,而是清除它并阻止它编译.是否有这样做没有确定某种形式的虚拟变量追加到年底的清洁方式CFLAGS和LDFLAGS?
指向非const数据的指针可以隐式转换为指向相同类型的const数据的指针:
int *x = NULL;
int const *y = x;
Run Code Online (Sandbox Code Playgroud)
添加额外的const限定符以匹配额外的间接寻址应该在逻辑上以相同的方式工作:
int * *x = NULL;
int *const *y = x; /* okay */
int const *const *z = y; /* warning */
Run Code Online (Sandbox Code Playgroud)
-Wall但是,使用标志对GCC或Clang进行编译会产生以下警告:
test.c:4:23: warning: initializing 'int const *const *' with an expression of type
'int *const *' discards qualifiers in nested pointer types
int const *const *z = y; /* warning */
^ ~
Run Code Online (Sandbox Code Playgroud)
为什么添加额外的const限定符"在嵌套指针类型中丢弃限定符"?
我正在尝试对一些非常集合的Scala进行单元测试.这些集合作为返回Iterable[T],因此我对集合的内容感兴趣,即使基础类型不同.这实际上是两个相关的问题:
总之,我在ScalaTest中看到Scala等效的NUnit CollectionAssert.AreEqual(有序)和CollectionAssert.AreEquivalent(无序):
Set(1, 2) should equal (List(1, 2)) // ordered, pass
Iterable(2, 1) should equal (Iterable(1, 2)) // unordered, pass
Run Code Online (Sandbox Code Playgroud) 根据我所做的大部分读数,当"向前"和"向后"边界首先相交时,称双向搜索算法终止.然而,在人工智能:现代方法的第3.4.6节中,Russel和Norvig说:
通过检查目标测试以查看两个搜索的边界是否相交来实现双向搜索; 如果他们这样做,就找到了解决方案.重要的是要意识到找到的第一个解决方案可能不是最优的,即使这两个搜索都是广度优先的; 需要进行一些额外的搜索,以确保跨越差距没有捷径.
我已经考虑了这个陈述很长一段时间了,但我找不到这种行为的例子.任何人都可以提供一个示例图,其中双向BFS或A*搜索的前向和后向边界之间的第一个交叉点不是最短路径吗?
编辑:显然,BFS无法在加权图中找到最短路径.听起来这段摘录指的是无向图上的双向BFS.或者,我有兴趣在加权图上看到使用双向A*的反例.
在C++ 11中,std::unique_lock构造被重载以接受型标签defer_lock_t,try_to_lock_t和adopt_lock_t:
unique_lock( mutex_type& m, std::defer_lock_t t );
unique_lock( mutex_type& m, std::try_to_lock_t t );
unique_lock( mutex_type& m, std::adopt_lock_t t );
Run Code Online (Sandbox Code Playgroud)
这些是空类(类型标记),定义如下:
struct defer_lock_t { };
struct try_to_lock_t { };
struct adopt_lock_t { };
Run Code Online (Sandbox Code Playgroud)
这允许用户通过传递这些类的预定义实例之一来消除三个构造函数之间的歧义:
constexpr std::defer_lock_t defer_lock {};
constexpr std::try_to_lock_t try_to_lock {};
constexpr std::adopt_lock_t adopt_lock {};
Run Code Online (Sandbox Code Playgroud)
我很惊讶这不是作为一个实现的enum.据我所知,使用一个enum会:
为什么标准库使用类型标签而不是a enum来消除这些构造函数的歧义?也许更重要的是,在编写自己的C++代码时,我是否还喜欢在这种情况下使用类型标签?
有大量关于重载的信息可以operator<<模仿toString()将复杂对象转换为字符串的a- style方法.我很感兴趣,也实施反,operator>>反序列化字符串转换成一个对象.
通过检查STL来源,我收集了:
istream &operator>>(istream &, Object &);
Run Code Online (Sandbox Code Playgroud)
将是反序列化类型对象的正确函数签名Object.不幸的是,我对如何正确实现这一点感到茫然 - 特别是如何处理错误:
我最近确定需要在微控制器的EEPROM中存储不经常更新的配置变量.立即向程序添加状态会让人担心
广泛的谷歌搜索只发现了一篇文章,通过固件更新保持您的EEPROM数据有效.有没有人使用过该文章中讨论的方法?有更好的替代方法吗?
由于我的一些代码需要在不同类型的矩阵之间进行隐式转换(例如Matrix<int>to Matrix<double>),我定义了一个模板化的复制构造函数Matrix<T>::Matrix(Matrix<U> const&)而不是标准Matrix<T>::Matrix(Matrix<T> const&):
template <typename T> class Matrix {
public:
// ...
template <typename U> Matrix(Matrix<U> const&);
// ...
private
unsigned int m_rows, m_cols;
T *m_data;
// ...
};
Run Code Online (Sandbox Code Playgroud)
通过向复制构造函数添加适当的类型转换,此方法可以在不同类型的矩阵之间完美地转换.令人惊讶的是,在一个简单的复制构造函数可以运行的情况下,它会因malloc错误而失败:where U == T.果然,使用默认Matrix<T>::Matrix(Matrix<T> const&)签名重载复制构造函数可以解决问题.
这是一个糟糕的解决方案,因为它导致复制构造函数代码的批量复制(字面意思是未更改的复制和粘贴).更重要的是,我不明白为什么malloc没有重复代码会出现双重自由错误.此外,为什么template <typename T> template <typename U>这里需要极其冗长的语法而不是标准,而且更简洁template <typename T, typename U>?
模板化方法的完整源代码,在Mac OS 10.5上使用G ++ v4.0.1编译.
template <typename T> template <typename U> Matrix<T>::Matrix(Matrix<U> const& obj) {
m_rows = obj.GetNumRows();
m_cols …Run Code Online (Sandbox Code Playgroud) 我已经成功地使用boost::spirit::qi到解析由内置的解析器(如流byte_,little_word等).但是,我现在需要解析不完全属于这些类别之一的数据.例如,我想将16.16定点二进制数转换为double; 例如,little_word << little_16p16将解析a uint16_t后跟a double(从定点数解析).
我首先考虑语义动作,但(我认为......)它们不合适,因为它们不会更改与解析器关联的属性的类型.我也无法弄清楚如何使员工struct-parsing示例适应这种情况,因为它依赖于提供的隐式转换boost::fusion.这种方法在这里不起作用,因为我显然不能uint32_t在double不引起重大问题的情况下定义隐式转换.
我倾向于我需要添加非终端来包装内置的二进制原语解析器或从头开始编写终端解析器.即使看了之后qi_binary.hpp,我也不知道该如何做.任何人都可以提供一些示例代码和/或指导我开始相关的参考资料吗?
我试图确定以下代码是否调用未定义的行为:
#include <iostream>
class A;
void f(A& f)
{
char* x = reinterpret_cast<char*>(&f);
for (int i = 0; i < 5; ++i)
std::cout << x[i];
}
int main(int argc, char** argue)
{
A* a = reinterpret_cast<A*>(new char[5])
f(*a);
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,reinterpret_casts to和from char*是兼容的,因为标准允许别名char和unsigned char指针(强调我的):
如果程序试图通过不同于以下类型之一的左值访问对象的存储值,则行为未定义:
- 对象的动态类型,
- 一个cv限定版本的动态类型的对象,
- 与对象的动态类型对应的有符号或无符号类型的类型,
- 一种类型,是有符号或无符号类型,对应于对象动态类型的cv限定版本,
- 一种聚合或联合类型,包括其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员),
- 一个类型,它是对象动态类型的(可能是cv限定的)基类类型,
- a
char或unsigned char类型.
但是,我不确定是否f(*a)通过创建A&对无效指针的引用来调用未定义的行为.决定因素似乎是"尝试访问"措辞意味着在C++标准的背景下.
我的直觉是,这并不能构成一个访问,由于访问都需要A进行定义(现声明,但在这个例子中没有定义).不幸的是,我在C++标准中找不到"访问"的具体定义:
是否f(*a)调用未定义的行为?什么构成C++标准中的"访问"? …
c++ standards strict-aliasing language-lawyer reinterpret-cast