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

J. *_*rez 2 c++ gcc compiler-optimization

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

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

Ale*_*agh 5

实际上,可以使用using #pragma optimize语句或using __attribute__((optimize("-O3")))所有的optimize选项在此处找到。

一个简单的例子是:

#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();
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是不同的编译器,我强烈建议您使用宏将它们包装起来(或使用pragma语句),而不是__attribute__避免出现任何编译器警告。