是否可以使用GCC编译具有特定编译器标志的代码文件的一部分?

时间:2017-07-07 19:41:15

标签: c++ gcc compiler-optimization

是否可以使用GCC编译具有特定编译器标志的代码文件的一部分?例如,假设我有一些我正在测试的功能。我希望这些函数严格遵守标准,因此我想用--pedantic标志编译它们。但是进行测试的代码会在编译时发出很多警告。有没有办法用--pedantic编译那些特定的函数?

或者,假设我有一个精心编写但非常昂贵的功能,需要尽可能快地运行。我如何使用-Ofast编译该函数(以及其他一些函数),并使用-O2或-O3编译程序的其余部分?

3 个答案:

答案 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_optionsdiagnostic push分别保存优化和诊断标记,然后再将其更改为迂腐和O0(或O1O2O3OsOg)。 pop pragma恢复原始设置。

有关优化编译指示的更多详细信息为here,诊断编译指示的详细信息为here

答案 2 :(得分:0)

GCC在某些情况下允许这种情况,但不是全部。

对于优化选项,您可以使用optimize function attributeequivalent #pragma directive

对于警告选项,它不太可靠。我认为它只有a pragma而不是函数属性,它显然不支持所有警告。

对于警告或优化以外的选项,除了使用单独的文件外,我不知道有什么方法可以做到这一点。