我正在阅读FreeBSD 编码风格并且非常喜欢它(因为我喜欢垂直紧凑的代码)。然而有这样的:
初始化所有变量
您应始终初始化变量。总是。每次。带有 -W 标志的 gcc 可能会捕获对未初始化变量的操作,但也可能不会。理由
更多的问题最终会追溯到未初始化的指针或变量。
当变量没有合适的初始值时,不给它赋值不是更好吗?这样编译器可能会捕获未初始化的读取。我不是在谈论T *p = NULL
,这是一个陷阱表示,可能(或可能不是)非常有用,而是int personal_number = 0 /* but 0 is a valid personal number!!*/
为了澄清,为了回应abasu的评论,我的例子试图说明没有可用的无效值的情况。我问了一个问题,得到的答案是使用不可能的值来标记错误或其他条件非常棒。但情况并非总是如此。例子很多:8位像素值、速度矢量等。
我可以看到“始终初始化变量”的一种有效替代方法是:
//logical place for declarations
T a;
/*code, for example to set up the environment for evaluating a*/
a = fooForA();
/*more code*/
fooThatUsesA(a);
Run Code Online (Sandbox Code Playgroud)
这样,如果忘记初始化,将会出现警告,并且错误将被修复,消除警告。
Haskell新手在这里.我的观察是:
zip
并且zip3
是重要的功能 - 包含在前奏中,由许多其他语言实现,代表了数学中的常见操作(换位)
在参数结构方面不通用
易于用传统语言实现 - C或C++(比如20小时工作); python已经将它作为内置版本
为什么zip
这么受限制?有抽象,概括吗?n大小的元组出了什么问题?
它们的巨大优势,即插入O(1),在碎片化内存的环境中看起来相当无用,并且数千次调用内存分配器给我们另外10个字节.
编辑澄清:
在一次采访中询问了这个问题.这不是一个工作场所的问题,所以通常的启发式方法是希望盲目地从一小组标准算法中找出正确的决策,这是不适用的.
现有的答案和评论提到"malloc不是那么慢","malloc部分地与碎片作斗争".好吧,如果我们使用另一种数据结构,例如C++向量的C端口(即 - 分配足够大小的顺序内存,如果数据扩展,重新分配到两倍大的块),所有问题都解决了,但我们放松了快速插入/删除.链接列表(分配在哪里?)的任何场景都具有对向量的巨大优势?
我正在学习Python.到目前为止filter
,id
和其他词语一起生成警告Warning: assignment to reserved built-in symbol
.好吧,我正在设计过滤器并为每个分配id -s,这个警告迫使我在整个地方使用下划线.
C的保留关键字是缩短的单词,例如int
或者不经常使用的英语单词,例如volatile
.我如何应对Python编程语言的极端可读性,这迫使我使自己的程序不可读?
通过遵循经验法则更喜欢static_cast
或dynamic_cast
在其他一切之前,我编写了以下程序:
int main(void)
{
int i = 0;
unsigned *j = static_cast<unsigned*>(&i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,它甚至没有编译:
$ g++ --std=c++11 test5.cpp
test5.cpp: In function ‘int main()’:
test5.cpp:4:44: error: invalid static_cast from type ‘int*’ to type ‘unsigned int*’
unsigned *j = static_cast<unsigned*>(&i);
^
Run Code Online (Sandbox Code Playgroud)
为什么这是错的?这种情况的正确演员是什么?
检查序列容器是否在内存中是连续的.
仅接受某些类型的C++模板
我正在编写一个简单的send()
方法,它在内部使用C风格的指针.我希望它能够使用所有保证的序列容器.我的动机是双重的:
std::array
避免堆分配.这是我有多远:
template <typename Container>
void poll( Container &out )
{
static_assert( std::is_base_of< std::array<typename Container::value_type>, Container >::value ||
std::is_base_of< std::vector<typename Container::value_type>, Container >::value ||
std::is_base_of< std::string<typename Container::value_type>, Container >::value,
"A contiguous memory container is required.");
}
Run Code Online (Sandbox Code Playgroud)
麻烦的是,std::array
需要第二个参数,并且在编译时无法知道.这个问题可以解决吗?可能采用不同的方法?
初始化 const 自动变量的首选方法是什么?我能想到几个。
if
陈述:
const std::string s;
if( condition ) { const_cast<std::string&>(s) = "first"; }
else { const_cast<std::string&>(s) = "second"; }
Run Code Online (Sandbox Code Playgroud)
?:
操作员:
const std::string s = ( condition ) ? "first" : second;
Run Code Online (Sandbox Code Playgroud)
立即调用函数表达式:
const std::string s = [ & ] ()
{ if( condition ) return "first" else return "second" } ();
Run Code Online (Sandbox Code Playgroud) Ben Deane提到了throw技巧,它确保在非constexpr上下文中使用constexpr函数时出现链接错误.
这是我的看法:
#include <iostream>
struct Exc;
constexpr int foo( int a )
{
if( a == 42 )
{
throw Exc{};
}
return 666;
}
int main()
{
constexpr auto ret = foo(43);
std::cout << ret << "\n";
return ret;
}
Run Code Online (Sandbox Code Playgroud)
但我无法使它工作(clang ++ 3.8.1-23和g ++ 6.3.0):
$ clang++ -std=c++14 main.cpp
main.cpp:9:15: error: invalid use of incomplete type 'ExcBase'
throw ExcBase{};
^~~~~~~~~
main.cpp:3:8: note: forward declaration of 'ExcBase'
struct ExcBase;
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
这个帖子中的评论暗示了另一个技巧:
#include <iostream> …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为Web资源(延迟获取的图像)实现可迭代的代理。
首先,我做到了(返回id,在生产中,这些将是图像缓冲区)
def iter(ids=[1,2,3]):
for id in ids:
yield id
Run Code Online (Sandbox Code Playgroud)
效果很好,但现在我需要保持状态。
我阅读了定义迭代器的四种方法。我判断迭代器协议是要走的路。跟随我的尝试和失败,以实现这一目标。
class Test:
def __init__(me, ids):
me.ids = ids
def __iter__(me):
return me
def __next__(me):
for id in me.ids:
yield id
raise StopIteration
test = Test([1,2,3])
for t in test:
print('new value', t)
Run Code Online (Sandbox Code Playgroud)
输出:
new value <generator object Test.__next__ at 0x7f9c46ed1750>
new value <generator object Test.__next__ at 0x7f9c46ed1660>
new value <generator object Test.__next__ at 0x7f9c46ed1750>
new value <generator object Test.__next__ at 0x7f9c46ed1660>
new value <generator object Test.__next__ …
Run Code Online (Sandbox Code Playgroud) 我与实验php
的上apache
的学习体验服务器.由于不愿意设置生产和开发服务器,我被指导/etc/php5/apache2/php.ini
应该用于启用警告.
我想只在从特定IP访问apache服务器时启用调试消息:我的外部IP.怎么能实现这一目标?