相关疑难解决方法(0)

gcc -O0仍然优化了"未使用"的代码.是否有一个编译标志来改变它?

当我提出这个问题时,gcc正在删除(是的,带有-O0)一行代码,_mm_div_ss(s1, s2);大概是因为结果没有保存.但是,这应该触发浮点异常并引发SIGFPE,如果删除调用则不会发生这种情况.

问题:是否有一个标志或多个标志传递给gcc,以便代码按原样编译?我在想什么,fno-remove-unused但我没有看到类似的东西.理想情况下,这将是一个编译器标志,而不是必须更改我的源代码,但如果不支持,是否需要使用一些gcc属性/ pragma?

我试过的事情:

$ gcc --help=optimizers | grep -i remove
Run Code Online (Sandbox Code Playgroud)

没有结果.

$ gcc --help=optimizers | grep -i unused
Run Code Online (Sandbox Code Playgroud)

没有结果.

并明确禁用所有死代码/消除标志 - 请注意,没有关于未使用代码的警告:

$ gcc -O0 -msse2 -Wall -Wextra -pedantic -Winline \
     -fno-dce -fno-dse -fno-tree-dce \
     -fno-tree-dse -fno-tree-fre -fno-compare-elim -fno-gcse  \
     -fno-gcse-after-reload -fno-gcse-las -fno-rerun-cse-after-loop \
     -fno-tree-builtin-call-dce -fno-tree-cselim a.c
a.c: In function ‘main’:
a.c:25:5: warning: ISO C90 forbids mixed declarations and code [-Wpedantic]
     __m128 s1, s2;
     ^
$
Run Code Online (Sandbox Code Playgroud)

来源计划 …

c gcc

46
推荐指数
3
解决办法
4738
查看次数

编译器:如果条件总是为真/假,该怎么办?

我想到条件和编译器.我正在编写Arduino的应用程序,所以我需要尽可能快的应用程序.

在我的代码中我有这个:

#define DEBUG false    

...

if (DEBUG)
{
  String pinName;
  pinName = "Pin ";
  pinName += pin;
  pinName += " initialized";
  Serial.println(pinName);
}
Run Code Online (Sandbox Code Playgroud)

我想知道编译器是否在二进制文件中不包含代码(if块中的代码).条件总是错误的,所以程序永远不会去那里.

从另一方面来看.如果DEBUG是真的怎么办?Arduino是否测试条件或编译器只包含if在二进制文件中的主体?

我发现这个网站https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_4.html关于#if指令,所以我可以重写代码以获得这些指令而不是"正常"if.但我想知道我是否应该重写它,或者是否浪费时间.

c c++ gcc if-statement arduino

13
推荐指数
1
解决办法
1936
查看次数

标签 统计

c ×2

gcc ×2

arduino ×1

c++ ×1

if-statement ×1