AudioDroid の回答と同様に、1 つの「ファサード ヘッダー」に含まれるさまざまなヘッダーを使用できます。
インクルードアプローチ (テストダブル)
portconfig.hデータを含めるためのヘッダー - 必要なターゲットに応じて (またはテストに使用している場合)
#ifndef PORTCONFIG_H
#define PORTCONFIG_H
#ifdef TARGET_A
# include <portconfig_target_a.h> /* Use the config for target A */
#elif defined TARGET_B
# include <portconfig_target_b.h> /* Use the config for target B */
#elif defined TEST
# include <portconfig_testing.h> /* Use this instead for testing */
#else
# error "Not supported!" /* Just in case ... */
#endif
#endif /* PORTCONFIG_H */
これらの各ヘッダー ファイルには、ターゲットで必要とされるこれらの「定義」が含まれています。
portconfig_target_a.h
...
#define PORTA_CONFIG (*(volatile unsigned int*) (0x1000))
...
また
portconfig_testing.h
...
volatile unsigned int PORTA_CONFIG;
...
これは、中央#ifdef
の 1 か所でのみ必要なため、メンテナンスの労力が少なくて済みます。また、ターゲット/テスト コードの使用法に違いはなく、すべての場合に使用されます。#include <portconfig.h>
抽象化アプローチ
PORTA_CONFIG
直接使用する代わりに、関数/マクロに抽象化することもできます。テストのために、これらをモックできます。
typedef IOAddress ...
IOData IOData ...
void writePort(IOAddress addr, IOData data);
IOData readPort(IOAddress);
これには抽象化の利点があり、テストに非常に役立ちます。
このリポジトリには実装といくつかの優れた例があり、特にcode
(MockIO、ヘッダー、実装、サンプル テスト) - CppUTest を使用しています。
こちらもご覧ください