2017-07-07 17 views
2

GCCを使用して、特定のコンパイラフラグを使用してコードファイルの1つのセクションをコンパイルできますか?たとえば、私がテストしていた機能がいくつかあったとします。私はこれらの関数を標準準拠に厳密に従わせたいので、 - pedanticフラグを付けてコンパイルしたいと思います。しかし、テストを行うコードは、コンパイル時に多くの警告を出します。 --pedanticを使って特定の関数だけをコンパイルする方法はありますか?GCCを使用して、特定のコンパイラフラグを持つコードファイルの1つのセクションをコンパイルできますか?

また、慎重に書かれていますが、できるだけ早く実行する必要がある非常に高価な機能があるとします。どのようにしてそのファンクション(とその他のもの)を-Ofastでコンパイルすれば、残りのプログラムを-O2または-O3でコンパイルできますか?

+2

これらの機能を別々のファイルに置き、別々のフラグを使用してそれらを構築します。これは簡単な解決策になります。 "テストを行うコードはたくさんの警告を出す" - すでにそれらを修正する - 待つか言い訳しない - コンパイラの警告を修正する(そして '-Werror'でビルドを開始する) –

+0

[GCC - 特定の関数でのみコンパイラフラグを有効にする]の可能な複製(https://stackoverflow.com/questions/12925989/gcc-enable-compiler-flags-only-on-specific-functions) – Pyves

答えて

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にそれらの変更に先立って、それぞれ、最適化および診断のフラグを保存(またはO1を、O2O3OsOg)。 popプラグマが元の設定に戻ります。

最適化プラグマの詳細はhereで、診断プラグマの詳細はhereです。

4

実際には#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(); 
} 

、私は非常にマクロでそれらをラップ(または任意のコンパイラの警告を回避するために、プラグマ・ステートメントではなく、__attribute__を使用することをお勧めします

0

。 GCCで可能な場合もありますが、すべてではありません。

最適化オプションの場合は、optimize function attributeまたはequivalent #pragma directiveを使用できます。

警告オプションについては信頼性が低くなります。私はそこにはa pragmaしかありませんし、関数属性ではないと思います。明らかにすべての警告をサポートしているわけではありません。

警告や最適化以外のオプションについては、別のファイルを使用する以外の方法はありません。

関連する問題