是否可以使用GCC编译具有特定编译器标志的代码文件的一部分?例如,假设我有一些我正在测试的功能。我希望这些函数严格遵守标准,因此我想用--pedantic标志编译它们。但是进行测试的代码会在编译时发出很多警告。有没有办法用--pedantic编译那些特定的函数?
或者,假设我有一个精心编写但非常昂贵的功能,需要尽可能快地运行。我如何使用-Ofast编译该函数(以及其他一些函数),并使用-O2或-O3编译程序的其余部分?
答案 0 :(得分:5)
实际上,使用#pragma optimize
语句或使用__attribute__((optimize("-O3")))
可以找到所有优化选项here。
一个简单的例子是:
#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();
}
如果你使用不同的编译器,我强烈建议用宏包装它们(或使用pragma语句而不是__attribute__
来避免任何编译器警告。
答案 1 :(得分:1)
是
#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
pragma恢复原始设置。
答案 2 :(得分:0)
GCC在某些情况下允许这种情况,但不是全部。
对于优化选项,您可以使用optimize
function attribute或equivalent #pragma
directive。
对于警告选项,它不太可靠。我认为它只有a pragma而不是函数属性,它显然不支持所有警告。
对于警告或优化以外的选项,除了使用单独的文件外,我不知道有什么方法可以做到这一点。