2013-06-21 20 views
41

ヘッダーに#defineの選択肢があり、ユーザーが編集できるようになっているので、ユーザーがそれらを完全に削除する場合に定義が存在することを確認します。複数の定義が定義されていない場合のプリプロセッサのチェック

#if defined MANUF && defined SERIAL && defined MODEL 
    // All defined OK so do nothing 
#else 
    #error "User is stoopid!" 
#endif 

これは完全にOKに動作し、複数の定義が所定の位置にされていないかどうかを確認するためのより良い方法があるかどうか、私はしかし疑問に思って...つまり、のようなもの:

#ifn defined MANUF || defined SERIAL ||.... // note the n in #ifn 

または多分

#if !defined MANUF || !defined SERIAL ||.... 

空の#ifセクションが不要です。

+3

FYI: 'defined'は次のようなエントリです。関数のように呼び出されます( 'sizeof'と同じです)。だから関数のように呼び出すと、あなたの例は正常に動作します。また、プリプロセッサの文でも、ほとんどの論理演算子( '=='、 '!='、 '!'、 '||'、 '&&')を使うことができます。 –

+4

boolean代数の一般的な原則は '!(x && y)'を '(!x ||!)'に置き換えることです。 http://en.wikipedia.org/wiki/De_Morgan%27s_laws – Vicky

答えて

69
#if !defined(MANUF) || !defined(SERIAL) || !defined(MODEL) 
+0

括弧を追加する必要がありますか? "#if!defined MANUF || ..."? – TimK

+0

@TimK上記の内容から、「はい」と言います。私は間違っている可能性があります。これは単に前提です。 – wizzwizz4

+2

実際にはありませんが、わかりやすくするためにお勧めします。 https://godbolt.org/g/O48eun –

1

FWIW、@ SergeyLの答えは素晴らしいですが、ここではテストのためのわずかな変形があります。論理的または論理的な変更を書き留めておきます。

main.cのは、このようなメインラッパーを有する:

#ifdef TEST_USB 
int main(int argc, char *argv[]) { 
    // the main() routine for testing the usb code. 
} 

#if !defined(TEST_SPI) && !defined(TEST_SERIAL) && !defined(TEST_USB) 
int main(int argc, char *argv[]) { 
    // the true main() routine. 
} 

spi.c、serial.cとusb.cは、このようなそれぞれのテストコードのメインラッパーを有しますconfig.h すべてのcファイルに含まれるのは次のようなエントリです:

// Uncomment below to test the serial 
//#define TEST_SERIAL 


// Uncomment below to test the spi code 
//#define TEST_SPI 

// Uncomment below to test the usb code 
#define TEST_USB 
関連する問題