当我提出这个问题时,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)
来源计划 …
我想到条件和编译器.我正在编写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.但我想知道我是否应该重写它,或者是否浪费时间.