【问题标题】:Is it possible to use GCC to compile one section of a code file with specific compiler flags?是否可以使用 GCC 编译具有特定编译器标志的代码文件的一部分?
【发布时间】:2017-07-07 19:41:14
【问题描述】:

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

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

【问题讨论】:

  • 将这些函数放在单独的文件中并使用单独的标志构建它们 - 将是简单的解决方案。 “执行测试的代码会发出很多警告” - 所以已经修复它们 - 不要等待或找借口 - 修复编译器警告(并开始使用 -Werror 构建)。

标签: c++ gcc compiler-optimization


【解决方案1】:

实际上有使用#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__ 以避免任何编译器警告。

【讨论】:

    【解决方案2】:

    是的。

    #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 分别保存优化和诊断标志,然后将它们更改为 pedantic 和 O0(或 O1O2O3Os、@987654331 @)。 pop pragma 恢复原始设置。

    有关优化 pragma 的更多详细信息是 here,有关诊断 pragma 的详细信息是 here

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多