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

Is it possible to use GCC to compile one section of a code file with specific compiler flags?

本文关键字:标志 编译器 代码 文件 一部分 可以使 GCC 编译 是否      更新时间:2023-10-16

是否可以使用 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_optionsdiagnostic push分别保存优化和诊断标志,然后再将它们更改为迂腐和O0(或O1O2O3OsOg(。pop杂注将恢复原始设置。

有关优化编译指示的更多详细信息,请参阅此处,有关诊断编译指示的详细信息,请参阅此处。

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

对于优化选项,可以使用optimize函数属性或等效的#pragma指令。

对于警告选项,它不太可靠。我认为它只有一个编译指示,而不是函数属性,而且它显然不支持所有警告。

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