我查看了一些丑陋的代码(在迭代时修改了基础序列),并探索了基于范围的for循环的定义,我去了cppreference。
在那里,我注意到了一些奇怪的事情:
基于范围的for循环在C ++ 17中已更改,但我看不到更改的原因,并且代码对我来说看起来相同(只是“重构”)。因此,旧的是:
{
auto && __range = range_expression;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
Run Code Online (Sandbox Code Playgroud)
新的是
{
auto && __range = range_expression;
auto __begin = begin_expr;
auto __end = end_expr;
for ( ; __begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
Run Code Online (Sandbox Code Playgroud)
为什么要进行此更改,并且它会使任何合法的C ++ 14程序在C ++ 17中表现出未定义的行为(UB)?
我来自Objective-C和Cocoa世界,那里有很多常规,许多人会说它让你的代码变得美丽!现在用C++编程我找不到像C++这样的好文档.
标准C++可能没有上面的内容,但我希望我可以坚持使用其他一些SDK或API(如Microsoft的(?)等)约定.
我希望你能给我一些链接.
我以前在变量名称中避免使用下划线,这可能是我大学Java时代的延续.因此,当我在Objective C中定义一个属性时,这就是我自然而然的事情.
// In the header
@interface Whatever
{
NSString *myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty;
Run Code Online (Sandbox Code Playgroud)
但在几乎所有的例子中都是如此
// In the header
@interface Whatever
{
NSString *_myStringProperty
}
@property (nonatomic, copy) NSString *myStringProperty;
// In the implementation
@synthesize myStringProperty = _myStringProperty;
Run Code Online (Sandbox Code Playgroud)
我应该克服对下划线的厌恶,因为这是应该做的一种方式,这种风格是否是一个很好的理由?
更新:现在使用自动属性合成你可以省略@synthesize,结果和你使用的一样
@synthesize myStringProperty = _myStringProperty;
Run Code Online (Sandbox Code Playgroud)
这清楚地表明了Apple的偏好.我已经学会了停止担忧并且喜欢下划线.
为什么我会收到编译器警告
标识符'Logic.DomainObjectBase._isNew'不符合CLS
对于以下代码?
public abstract class DomainObjectBase
{
protected bool _isNew;
}
Run Code Online (Sandbox Code Playgroud) 我刚刚发现,在某一点上,C++ 11草案具有std::begin/ std::end重载std::pair,允许将一对迭代器视为适合在基于范围的for循环中使用的范围(N3126,第20.3.5.5节),但这有自从被删除.
有谁知道为什么它被删除了?
我发现删除非常不幸,因为似乎没有其他方法可以将一对迭代器视为范围.确实:
std::pair 没有开始/结束成员函数std::pair<T, U>是namespace stdstd::begin/ std::end为std::pair自己std::begin/ std::endfor std::pair(因为专业化必须是部分的,而且不允许使用函数)还有其他一些我失踪的方式吗?
注意:这是一个c问题,但我添加了c ++,以防一些C++专家可以提供C++使用与C不同的措辞的基本原理或历史原因.
在C标准库规范中,我们有这个规范性文本,C17 7.1.3保留标识符(强调我的):
- 所有以下划线开头的标识符以及大写字母或另一个下划线始终保留用于任何用途.
- 所有以下划线开头的标识符始终保留用作普通和标记名称空间中具有文件范围的标识符.
现在我继续阅读各种受尊敬的C专家的答案,他们声称编译器或标准库可以使用下划线+大写或双下划线的标识符.
是否"保留用于任何用途"是指保留给除C语言本身的未来扩展之外的任何人?这意味着实现不容许使用它们.
虽然上面的第二个短语,关于单个前导下划线似乎是针对实现?
通常,C标准的编写方式要求编译器供应商/库实现者是典型的读者 - 而不是应用程序员.
值得注意的是,C++的措辞非常不同:
- 每个包含双下划线(
__)或以下划线后跟大写字母(2.11)开头的名称都保留给实现以供任何使用.
(请参阅在C++标识符中使用下划线有哪些规则?)
这可能是C和C++之间的混淆,语言在这里有所不同吗?
extern int ether_hostton (__const char *__hostname, struct ether_addr *__addr)
__THROW;
Run Code Online (Sandbox Code Playgroud)
我在Linux机器上的/usr/include/netinet/ether.h中找到了上面的函数定义.
有人可以在const(关键字),addr(标识符)和最后__THROW前面解释双下划线的含义.
我什么时候应该将尾随添加_t到typedef'ed类型?
例如,我应该这样做:
typedef struct image image_t;
Run Code Online (Sandbox Code Playgroud)
或这个:
typedef struct image image;
Run Code Online (Sandbox Code Playgroud)
一般规则是什么?
另一个例子,我应该这样做:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type_t;
Run Code Online (Sandbox Code Playgroud)
或这个:
typdef enum { ARRAY_CLOSED, ARRAY_OPEN, ARRAY_HALFOPEN } array_type;
Run Code Online (Sandbox Code Playgroud)
请赐教.
谢谢,Boda Cydo.
我在typedef的boost :: shared_ptr模板的命名约定之间翻转.例如:
typedef boost::shared_ptr<Foo> FooPtr;
Run Code Online (Sandbox Code Playgroud)
在制定一项公约之前,我想看看其他人使用什么.你的约定是什么?
编辑:
对于那些在Foo中嵌入typedef的人来说,Foo现在"意识到"它将如何被传递并不会让你烦恼吗?它似乎打破了封装.这个怎么样:
class Foo
{
public:
typedef std::vector<Foo> Vector
};
Run Code Online (Sandbox Code Playgroud)
你现在不会这样做,对吗?:-)
我收到了一些C++代码,其中包含如下定义的各种结构:
typedef struct _someStruct_ {
std::string someString;
std::vector<std::string> someVectorOfStrings;
int someOtherStuff;
~_someStruct_()
{
someString.clear();
someVectorOfStrings.clear();
}
} someStruct;
Run Code Online (Sandbox Code Playgroud)
这里的析构函数是完全冗余的 - 如果结构是由默认的析构函数破坏的,那么任何字符串,向量等都不会被破坏吗?
如果我编写了代码,我就不会想到在这里添加一个显式的析构函数 - 我只是让编译器继续使用它.
据我所知,你可能需要在结构中创建自己的析构函数的唯一时间是结构的任何成员是否包含指向可能需要清理的数据的指针,或者是否有一些额外的功能(例如用于调试,记录时)需要一个结构被删除).
我在这里遗漏了什么 - 有没有理由在析构函数中明确清除字符串和向量?我怀疑发送给我的是一个C程序员(参见typedef),他试图将一些C代码转换成C++.
c++ ×7
c ×3
.net ×1
boost ×1
c# ×1
c++11 ×1
c++17 ×1
coding-style ×1
destructor ×1
for-loop ×1
foreach ×1
iphone ×1
objective-c ×1
range ×1
shared-ptr ×1
std-pair ×1
struct ×1
syntax ×1
typedef ×1