ヘッダインクルード前の
print_test.hpp
のインクルード前に #define
するかどうかで (例: #define USEMYPRINT
),
print_test.hpp
および print_test.cpp
内を,#ifdef
~ #else
~ #endif
により分岐させようとしています.
この際に .cpp
ファイル内まで,#define
で定義した内容が反映されませんでした.
このため,実体が生成されず,LNK 2019 エラーが発生してしまいます.
このような場合は,一般的にどのように解決されているでしょうか?
例えば,Eigen (線形代数演算ライブラリ) の場合,
#define EIGEN_NO_DEBUG // コード内のassertを無効化.
//#define EIGEN_DONT_PARALLELIZE // 並列を無効化.
//#define EIGEN_MPL2_ONLY // LGPLライセンスのコードを使わない.
#include "Eigen/Dense"
のように,インクルード前に #define
することで,assert
の無効化等を行うことができ,
非常に便利だと感じました.(しかし,私には一見するだけでは,どのように実現しているかわからず……)
下記にかなり簡略化したサンプルを示します.(この場合,.hpp
内では,#define USEMYPRINT
が認識されていますが,.cpp
内では,認識されず,実体が生成できないため,リンクエラーとなります)
よろしくお願いいたします.
環境 win8.1 Microsoft Visual Studio 2015 C++
main.cpp
#include <stdio.h>
#define USEMYPRINT // main.cpp 内でインクルード前に #define で定義されているかどうかにより,print_test.cpp および print_test.hpp で分岐を行いたい.
#include "print_test.hpp"
int main(){
MyPrintf();
return 0;
}
print_test.hpp
#pragma onece
#include <stdio.h>
#ifdef USEMYPRINT
void MyPrintf();
#endif//USEMYPRINT
print_test.cpp
#include "print_test.hpp"
#ifdef USEMYPRINT
void MyPrintf(){
printf("Hello my printf.\n");
}
#endif//USEMYPRINT
(みなさま,ご回答どうもありがとうございます.問題を解決することができました.
また,自分で見直しても質問の意図が分かり難かったため,可能な限り修正いたしました)
具体性が乏しいとご指摘をいただきましたので,修正したサンプルコードを下記に示します.(余り具体性が増していませんが,実体は下記のコードと同じ構成です)
すみません.上記サンプルコードでは,実体を定義するかどうかとなっていますが,実際には,実体を定義するかしないかの制御 (sayuri 様のご回答により,出力されるバイナリに変化はないと分かったため,下記サンプルでは省略),に加えて,文中で説明しているように,モードの切り替えも行いたい,と考えていました.
main.cpp
#include <stdio.h>
// Debug option
#define MyClass_Mode2
#include "MyClass.hpp"
int main(){
class MyClass* p_mc = new MyClass();
p_mc->MyFunction();
delete p_mc;
return 0;
}
MyClass.hpp
#pragma onece
#include <stdio.h>
class MyClass{
private:
public:
MyClass();
~MyClass();
void MyFunction();
};
MyClass.cpp
#include "MyClass.hpp"
void MyClass::MyFunction(){
#ifndef MyClass_Mode2
printf("Mode1.\n");
#else
printf("Mode2.\n");
#endif
}