当前位置: 首页 > 知识库问答 >
问题:

如何在if-else语句中使用C 20的可能/不可能属性

东门楚
2023-03-14

这个问题是关于C 20的[[可能]]/[[不太可能]]功能,而不是编译器定义的宏。

本文档(cppreference)仅给出了将它们应用于switch case语句的示例。这个switch-case示例与我的编译器(g-7.2)完美地编译在一起,所以我假设编译器已经实现了这个特性,尽管它还没有在当前的C标准中正式引入。

但是当我这样使用它们时:if(条件)[[可能]]{…}else{…},我收到了一个警告:

“警告:语句开头的属性被忽略[-Wattributes]”。

那么我应该如何在if-else语句中使用这些属性呢?

共有3个答案

步博厚
2023-03-14

那么我应该如何在if-else语句中使用这些属性呢?

正如您所做的那样,您的语法是正确的,如草案标准中给出的示例(简化为仅显示相关位):

int f(int n) {
    if (n > 5) [[unlikely]] {
        g(0);
        return n * 2 + 1;
    }

    return 3;
}

但是你应该明白这个特性是一个相对较新的特性,所以在实现中可能只有占位符来允许你设置属性。这从你的警告消息中看起来很明显。

您还应该理解,除非最新草案和最终产品之间的某些措辞发生变化,否则即使是兼容的实现也可以忽略这些属性。它们是对编译器的很多建议,如C中的inline。从最新的草稿n4762(在回答这个问题时,我强调):

注意:使用likely属性旨在允许实现针对这样的情况进行优化,即包含该属性的执行路径比在语句或标签上不包含该属性的任何替代执行路径更有可能。

注意单词“允许”而不是“强制”、“要求”或“授权”。

孙博艺
2023-03-14

例如,到今天为止,cppreference声明< code >可能(强调我的):

应用于语句,允许编译器针对包含该语句的执行路径比不包含该语句的任何替代执行路径更有可能出现的情况进行优化。

这表明放置属性的位置在最可能的语句中,即:

if (condition) { [[likely]] ... } else { ... }

例如,在使用 /std:c 最新进行编译时,Visual Studio 2019 16.7.0 接受此语法。

沃驰
2023-03-14

根据杰克逊维尔18 ISO C报告中的示例,语法是正确的,但似乎尚未实现:

if (a>b) [[likely]] {

10.6.6可能性属性[dcl.attr.likelion]草案

 类似资料:
  • 这里有一段代码: 它现在查找具有或日期在之后的的票据。我想改变这个。

  • 你好,我有两个代码示例 if/else if/else语句 可选语句 所以我的问题是这两者在性能方面是如何比较的(我在实际代码上有大约15-20个if-else语句)? 是否值得重构代码可读性与性能之间的关系,或者是对选项的误用? 另外,如果if/else-if语句增长到100+时,性能损失是什么? 提前致谢

  • 我有一个xslt文档。我想在这个文档中使用if语句。我的代码是: 如果返回的值是code1然后写A,如果返回的值是code2然后写B。 我该怎么做?

  • Swift 条件语句 一个 if 语句 后可跟一个可选的 else if...else 语句,else if...else 语句 在测试多个条件语句时是非常有用的。 当你使用 if , else if , else 语句时需要注意以下几点: if 语句后可以有 0 个或 1 个 else,但是如果 有 else if 语句,else 语句需要在 else if 语句之后。 if 语句后可以有 0

  • else语句可以与if语句结合使用。 else语句包含else语句中的条件表达式解析为0或FALSE值时执行的代码块。 else语句是一个可选语句, else后面最多只能有一个else语句。 语法 (Syntax) if...else语句的语法是 - if expression: statement(s) else: statement(s) 流程图 (Flow Diagram) 例

  • 首先,我发现了另外两条有类似问题的线索。问题在于,他们没有为字符串使用正确的等号,也没有为他们的特定问题正确设置if语句的格式。 在我的任务中,我需要创建一个名为“猪”的游戏,玩家与计算机对决,在掷骰子时先获得100分。如果玩家在一个回合中掷1,他们不会得到额外的分数。如果玩家掷两个1,那么他们将失去所有分数。我还没有对电脑的回合进行编码,只是专注于玩家。请告诉我我做错了什么。提前非常感谢。 我的