gpt4 book ai didi

c++ - gcc 优化

转载 作者:太空狗 更新时间:2023-10-29 20:29:06 30 4
gpt4 key购买 nike

我想知道在启用任何类型的 gcc/g++ 优化的情况下,以下代码是否会在编译时抛出错误或警告。

int a;
a = func();
if (a == 2) {
assert(false);
}

我认为以下代码可以在发布配置中抛出警告“已设置但未使用的变量”。

int a;
a = func();
assert(a != 2);

但是上面的代码呢? (gcc 可以 删除 if 语句本身,因为在 if 语句或 if block (在发布版本中)中什么都不会做,然后抛出警告“未使用但设置变量")

编辑:这绝对不是关于减少代码或 exe 大小的问题。我想知道一段在任何构建配置中都成功的代码。

编辑:我们在 Release模式下禁用断言

最佳答案

根据我的测试,以下代码会生成一个带有 -Wall -Wextra -O2 -DNDEBUG 的警告:

int a = func(); // warning: unused variable ‘a’
assert(a != 2);

但是下面的代码没有:

// no warnings
int a;
a = func();
assert(a != 2);

但是,您始终可以通过转换为 void 来抑制未使用的变量警告.

int a = func();
(void) a; // suppresses "unused variable" warning
assert(a != 2);

据我所知,a = func() 行语句始终算作使用变量 a ,而初始化算作使用。

随着编译器的变化和诊断的改进,我不会尝试对冲 future 可能的编译器警告,因为对冲有时会意外地抑制有效警告。

断言是如何定义的?

标准委员会和 C 实现者设计了 assert小心,以免产生虚假警告。请注意转换为 void 的常见方式是……

  • 没有NDEBUG , glibc 定义 assert大致按照以下方式(除了 abort 以外的其他方式):

    #define assert(expr) ((expr) ? (void) 0 : abort())
  • NDEBUG ,glibc 以这种方式定义它(按照 C 标准的要求):

    #define assert(expr) ((void) 0)
  • 下面定义assert不兼容,因为它不会扩展为表达式:

    #define assert(expr) { if (expr) { ... } } // wrong

C++ 的定义也略有不同。所以你看,assert以正确的方式定义,因此它不会产生任何伪造的编译器警告,而且它在语法上的行为确实像函数调用。

关于c++ - gcc 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11152040/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com