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
}