簡體   English   中英

是否可以使用GCC編譯具有特定編譯器標志的代碼文件的一部分?

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

是否可以使用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();
}

如果您使用的是不同的編譯器,我強烈建議您使用宏將它們包裝起來(或使用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將優化和診斷標志保存,然后將其更改為pedantic和O0 (或O1O2O3OsOg )。 pop指示符將恢復原始設置。

有關優化實用程序的更多詳細信息,請參見此處 ;有關診斷實用程序的詳細信息,請參見此處

GCC在某些情況下允許這樣做,但並非全部。

對於優化選項,可以使用optimize function屬性等效的#pragma指令

對於警告選項,它的可靠性較差。 我認為它只是一個實用工具,而不是函數屬性,並且它顯然不支持所有警告。

對於警告或優化以外的其他選項,除了使用單獨的文件外,我不知道有任何其他方法可以做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM