是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
Is it possible to use GCC to compile one section of a code file with specific compiler flags?
是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?例如,假设我正在测试一些函数。我希望这些函数严格遵守标准合规性,所以我想用 --pedantic 标志编译它们。但是进行测试的代码在编译时发出了很多警告。有没有办法用--pedantic编译那些特定的函数?
或者,假设我有一个精心编写但极其昂贵的函数,需要尽可能快地运行。我怎样才能用 -Ofast 编译该函数(和其他一些函数(,而用 -O2 或 -O3 编译程序的其余部分?
实际上,使用#pragma optimize
语句,或使用__attribute__((optimize("-O3")))
所有优化选项都可以在这里找到。
一个简单的例子是:
#include <stdio.h>
// Using attribute
__attribute__((optimize("-O3"))) void fast_function_attribute()
{
printf("Now calling a slow function, compiled with -O3 flags.n");
}
__attribute__((optimize("-O1"))) void slow_function_attribute()
{
printf("Now calling a slow function, compiled with -O1 flags.n");
}
// Using #pragma
#pragma GCC push_options
#pragma GCC optimize ("-O3")
void fast_function_pragma()
{
printf("This will be another fast routine.n");
}
#pragma GCC pop_options
#pragma GCC push_options
#pragma GCC optimize ("-O1")
void slow_function_pragma()
{
printf("This will be another slow routine.n");
}
#pragma GCC pop_options
int main(void)
{
fast_function_attribute();
slow_function_attribute();
fast_function_pragma();
slow_function_pragma();
}
如果您使用不同的编译器,我强烈建议使用宏包装它们(或使用编译指示语句而不是__attribute__
以避免任何编译器警告。
是的。
#include <iostream>
#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-Wpedantic"
#pragma GCC push_options
#pragma GCC optimize ("O0")
void bob(){
std::cerr<<"Sandwich maker!"<<std::endl;
}
#pragma GCC diagnostic pop
#pragma GCC pop_options
int main(){
bob();
}
push_options
和diagnostic push
分别保存优化和诊断标志,然后再将它们更改为迂腐和O0
(或O1
、O2
、O3
、Os
、Og
(。pop
杂注将恢复原始设置。
有关优化编译指示的更多详细信息,请参阅此处,有关诊断编译指示的详细信息,请参阅此处。
GCC在某些情况下允许这样做,但不是全部。
对于优化选项,可以使用optimize
函数属性或等效的#pragma
指令。
对于警告选项,它不太可靠。我认为它只有一个编译指示,而不是函数属性,而且它显然不支持所有警告。
对于警告或优化以外的选项,除了使用单独的文件之外,我不知道有什么方法可以做到这一点。
相关文章:
- 在 CMake 中为每个目标设置编译器/链接器标志
- Visual Studio 中是否有来自代码块的编译器标志的类似物?
- 如何将编译器标志限制为仅(我的)本地库?
- 为什么 gcc 编译器标志未知?
- 如何将编译器标志从 clang 传递给 nvcc
- 设置用于调试的 g++ 编译器标志
- 如何在 cmake 中设置编译器特定的标志
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- std::function, Clang 6.0 & MSVC (10.0017134.12) - 可能的 ABI 错误或必需的编译器标志
- 是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
- CMAKE 如何在 C++ 中将编译器标志附加到末尾
- 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?
- 如何在 Visual Studio Code 中包含编译器标志
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- 使用 noexcept 和编译器标志来关闭异常
- 运行时附加编译器标志
- 链接QT5库会自动将额外的FPIC标志传递给NVCC编译器,并通过cmake Cause错误
- 不能在 Solaris 的最新编译器中使用带有新 c+11 标志的 xercesc
- 在每个平台上使用相同的模拟,具有正确的编译器标志
- 如何在 CMake 中添加"-l" (ell) 编译器标志