我想创建一个多行字符串的makefile变量(例如电子邮件发布公告的正文).就像是
ANNOUNCE_BODY="
Version $(VERSION) of $(PACKAGE_NAME) has been released
It can be downloaded from $(DOWNLOAD_URL)
etc, etc"
Run Code Online (Sandbox Code Playgroud)
但我似乎找不到办法做到这一点.可能吗?
我经常在使用autotools(autoconf,automake)的项目的构建脚本中看到这一点.当有人想检查shell变量的值时,他们经常使用这个习惯用法:
if test "x$SHELL_VAR" = "xyes"; then
...
Run Code Online (Sandbox Code Playgroud)
与简单地检查这样的值相比,这有什么好处:
if test $SHELL_VAR = "yes"; then
...
Run Code Online (Sandbox Code Playgroud)
我认为必须有一些原因让我经常看到这一点,但我无法弄清楚它是什么.
我知道#warning指令不是标准的C/C++,但有几个编译器支持它,包括gcc/g ++.但对于那些不支持它的人,他们会默默地忽略它还是会导致编译失败?换句话说,我可以安全地在我的项目中使用它而不会破坏不支持它的编译器的构建吗?
c++ compiler-construction portability warnings c-preprocessor
在特定命名空间中创建库时,为该命名空间中的类提供重载操作符通常很方便.看来(至少用g ++),重载的运算符可以在库的命名空间中实现:
namespace Lib {
class A {
};
A operator+(const A&, const A&);
} // namespace Lib
Run Code Online (Sandbox Code Playgroud)
或全局命名空间
namespace Lib {
class A {
};
} // namespace Lib
Lib::A operator+(const Lib::A&, const Lib::A&);
Run Code Online (Sandbox Code Playgroud)
从我的测试来看,它们似乎都运行良好.这两个选项之间是否存在实际差异?两种方法都更好吗?
如果我正在编写一个库,并且我有一个需要返回一系列值的函数,我可以这样做:
std::vector<int> get_sequence();
Run Code Online (Sandbox Code Playgroud)
但是,这需要库用户使用std :: vector <>容器,而不是允许它们使用他们想要使用的任何容器.此外,它还可以添加返回数组的额外副本(取决于编译器是否可以优化),这可能会对性能产生负面影响.
理论上,您可以通过创建一个带有开始和结束的模板化函数来启用任意容器(并避免不必要的额外复制):
template<class T_iter> void get_sequence(T_iter begin, T_iter end);
Run Code Online (Sandbox Code Playgroud)
然后,该函数将序列值存储在迭代器给定的范围内.但问题在于它需要您知道序列的大小,以便在序列之间存储足够的元素begin并end存储所有值.
我想过一个界面如:
template<T_insertIter> get_sequence(T_insertIter inserter);
Run Code Online (Sandbox Code Playgroud)
这要求T_insertIter是一个插入迭代器(例如用它创建std::back_inserter(my_vector)),但这似乎太容易被滥用,因为编译器很乐意接受非插入迭代器,但在运行时会表现不正确.
那么设计返回任意长度序列的通用接口是否有最佳实践?
我不是要求代码实现,但是考虑到GTK +的技能,从抽象的角度来看,实现网格的最佳方式是什么,每个方块都是可点击的等等?