在哪里可以使用_Static_assert声明?

时间:2016-08-28 00:57:03

标签: language-lawyer c11 static-assert

这是一个有效的C11翻译单元,可以在没有GCC 5.1和Clang 3.7警告的情况下进行编译:

_Static_assert(1, "Test.");

int main(void) {
    return 0;
}

根据the draft standard N1570_Static_assert可以从declaration(参见第6.7节)和struct-declaration(参见第6.7.2.1节)非终结符生成function-definition我想强调最后一个:似乎你可以在哪里做任何声明,包括union或struct标签的声明,你也可以做一个静态断言。

但你真的可以在任何地方使用它们吗?

在可选的声明列表中?

请注意,declaration-list非终结符(请参阅第6.9.1节)可选地包含int main(void) _Static_assert(1, "Test."); { return 0; } 。我认为这里可以包含一个静态声明:

main.c:2:5: error: expected declaration specifiers before '_Static_assert'

然而,GCC 5.1抱怨:

for

Clang 3.7对该计划有类似的抱怨。

int main(void) { for (_Static_assert(1, "Test."); 0; ); return 0; } 语句的第一个参数中?

我们来看看这个节目:

for

尽管main.c:2:10: error: expected identifier or '(' 的第一个参数可以是自C99以来的表达式或声明,但即使GCC接受此程序,Clang也说:

_Static_assert

这些缺陷是在实现中,还是我在规范草案中遗漏了一些禁止在这些情况下使用override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showIngredientInRecipe" { if let selectedIndexPath = self.tableView.indexPathForSelectedRow { if selectedIndexPath.section == 1 { let listIngredients = recipeItem.ingredients[selectedIndexPath.row] selectedIngredient = listIngredients.ingredient let svc = segue.destinationViewController as! UINavigationController let destination = svc.topViewController as! IngredientDetailViewController destination.ingredientItem = selectedIngredient print("selectedIngredient \n \(selectedIngredient)") } } } } 的约束?

0 个答案:

没有答案