有人可以解释http://docs.openttd.org/ai__cargo_8cpp_source.html
上的以下代码行return (AICargo::TownEffect)::CargoSpec::Get(cargo_type)->town_effect;
如果这一行是:
return (AICargo::TownEffect) ::CargoSpec::Get(cargo_type)->town_effect;
(注意TownEffect)
和::
之间的空格)然后我会理解它。但是该文档中没有空格*,这意味着(AICargo::TownEffect)
是::运算符的左操作数。
这段代码如何工作/编译?或者由于一些模糊的C ++规则,这两件事情是否相等?
*在cpp文件中也是如此。
答案 0 :(得分:8)
除了分隔标记之外,C ++语法中的空格通常不重要。
括号很重要,它们不能出现在 qualified-id 中,因此不存在等价:
(AICargo::TownEffect)::CargoSpec::Get
和
AICargo::TownEffect::CargoSpec::Get
在第一个中有两个 qualified-ids ,一个在括号中,命名一个类型,另一个命名一个函数。在此上下文中对括号类型的唯一有效解释是 cast-expression 。在右括号后是否有空格没有区别。
答案 1 :(得分:1)
这是一个简单的解析问题:这里不需要空格,因为我们知道C样式的转换以括号结束。
这不再是不可读的:
if(cargo_type){return cargo_type->town_effect;}
这可能源于(
和)
不能成为标识符的一部分。
答案 2 :(得分:1)
当Charles说 qualified-id 中没有括号时,Charles就在上方。
我想在C ++中添加它,你不应该使用旧的C风格的转换作为一种风格问题。他们通常比你想要的更强大,并抛弃了const
,这通常不是你想要的。此外,它们实际上无法搜索您的代码库,因此很难查看通常更有可能导致错误的表达式。
相反,在这种情况下,如果你真的需要C风格演员的全部力量(目前无视const
),你应该使用reinterpret_cast<AICargo::TownEffect>
。但是,如果static_cast
足够,我不会看代码。