\n |
[ トップページ ]
[ ____CommandPrompt ]
[ ____JScript ]
[ ____MySQL ]
[ ____Cygwin ]
[ ____Java ]
[ ____Emacs ]
[ ____Make ]
[ ____Perl ]
[ ____Python ]
[ ____OpenGL ]
[ ____C# ]
[ ____StyleSheet ]
[ ____C++ ]
[ ____Winsock ]
[ ____Thread ]
[ ____VisualStudio ]
[ ____C ]
[ ____Win32API ]
[ ____Lua ]
[ ____PhotoShop ]
ヘッダ検索
■ マクロ(define.macro)
■ WIN32_LEAN_AND_MEAN
DESC
コンパイラにヘッダーからあまり使われない関数を省くように指示する。
軽くなるしれない。
■ WIN32
DESC
VisualStudio の Project に Default で定義されている
/D WIN32
_WIN32 とは異なる
■ Microsoft 固有のマクロ
DESC
Microsoft 固有というのは Microsoft の Compiler を使ったことのとき
■ _WIN64
DESC
platform x64 で有効になるマクロ
// ポインタ型のサイズを 64 32 bit 環境で切り替える
#ifdef _WIN64
typedef unsigned __int64 uintptr_t;
#else
typedef _W64 unsigned int uintptr_t;
#endif
■ _WIN32
DESC
Win32 用アプリケーションに対して定義されます
常に定義されます
Commpiler の CommandLine からは見えない
しかし次のようにチェックすると, 定義されている
// foo.c
#include< stdio.h>
int main()
{
#ifdef _WIN32
printf( "Defined" ); // cl はこちら
#else
printf( "Not Defined" ); // gcc( cygwin はこちら )
#endif
return 0;
}
■ ANSI C標準
■ __FILE__.__LINE__
ファイル名, 行数に置換される
■ __TIME__.__DATE__
日付、時刻に置換される。
■ 定義済みマクロ
VisualStudio ( cl.exe )固有の定義すみマクロは以下のものがある。
■ _WIN32
Win32 用アプリケーションに対して常に定義される。
検証用のコード。
CRT も含めて一切ヘッダをインクルードしないようにする。
#ifdef _WIN32
#error( "_WIN32 defined" )
#endif
int main() {
return 0;
}
ビルドして実行してみる。
cl test.cpp && .\test.exe
■ _MSC_VER
DESC
コンパイラバージョンを定義する。
Visual C++ 6.0 以降に対して 1200 以上として常に定義される。
POINT
また VisualStudio 固有のプラグマを利用する時の環境の判定にも使える。
#ifdef _MSC_VER
# pragma warning( push )
# pragma warning( disable : 4530 )
# pragma warning( disable : 4786 )
#endif
■ デバッグ用マクロ
■ _DEBUG
_ASSERTE などのデバッグ用のマクロ展開の切り替えに利用される。
windows.h などで定義されている デバッグ関数を利用するときは、このマクロを定義する必要がある。
■ NDEBUG
DESC
assert.h 内で assert マクロの展開を制御するためにユーザーが自分で定義するマクロ。
VisualStudio では Release 構成でこのマクロが有効になっている。
アサートを処理を無効化する。
cl /D"NDEBUG" test.cpp
#include< assert.h>
assert( !"test" );
■ 文字コード指定
■ UNICODE
使用する文字の文字コードを unicode に変更する場合に定義するマクロ。
UNICODEを定義してコンパイルすると unicode 用の関数が利用される。
( VisualStudio 2008 環境 )
cl /P /D"UNICODE" test.cpp
MessageBoxW( 0, s, s, 0x00000000L );
cl /P test.cpp
MessageBoxA( 0, s, s, 0x00000000L );
■ _WIN32_WINNT
XP 固有機能を使う
■ WIN32
DESC
Defined for WIN32 applications. Always defined.
Microsoft specific
// gcc -E main.cpp
#include< windows.h>
#ifdef _WIN32
DEFINE _WIN32 // こっちが残る
#else
NOT DEFINE _WIN32
#endif
■ __WINDLL
_WINDLL Windows protected-mode dynamic-link library is
selected with /GD.
■ __MINGW__
DESC
コンパイラ判別用のマクロ。
MinGW 環境で Build すると Define される
コンパイラを識別するために使う
■ __WIN32
cl gcc
__WIN32 ○ ×
WIN32 × ×
■ DLL
DESC
■ __DEBUG
DESC
Debug Build の Default MACRO
stdio.h にも 定義されている
■ _LIB
DESC
StaticLibrary のプロジェクトに設定されるマクロ。
cl -o main.exe ./main.cpp testlib.lib /IMPLIB:test.lib
// obj をつくる ( Compile のみする )
cl /c mod.cpp
// Archive する
lib mod.obj
lib mod.obj /out:mod.lib
// 同一の Symbol があれば ERROR ( と思ったら WARNING )
libA.obj : warning LNK4006:
"void __cdecl subA(void)" (?subA@@YAXXZ) は libB.obj で定義されています。
2 つ目以降の定義は無視されます。
libA.obj : warning LNK4221: パブリック シンボルが見つかりませんでした。アーカイブ メンバにアクセスできません。
lib libA.obj libB.obj
// libA.cpp
void subA() {}
// libB.cpp
void subA() {}
namespace で修飾すれば OK
namespace bar {
namespace foo {
void subA(){}
}
}
// こういう名前で変換される
$nm libB.obj
00000000 T ?subA@foo@bar@@YAXXZ
// obj, lib( obj のセット )は symbol がある
// しかし exe ( 実行 file )は存在しない
// これは Linker の立場からすると 名前引きをしているということ
// 一度, 結合( 完成 )すれば , 名前を書いておく必要がない
// Symbol と Debug 情報は異なる
|
|
NINJAIDX 15