/*	
 *	cliplibc.h
 *
 *	標準Ｃライブラリの補助
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2016 Naoyuki Sawa
 *
 *	* Thu Sep 08 22:20:43 JST 2016 Naoyuki Sawa
 *	- 新規作成。
 *	  このヘッダファイルは、下記の対応を行うために新規作成しました。
 *	  現在の所P/ECEでは不要ですが、統一のために、P/ECEでもclip.hからインクルードするようにしておきました。
 *	- init_program_invocation_name()が確実に実行されるように、「#pragma comment(linker, "/INCLUDE:_pinit_program_invocation_name")」及び「#pragma comment(linker, "/INCLUDE:pinit_program_invocation_name")」を追加しました。
 *	  VS2015のReleaseビルド対応のためです。詳細は、以下の通りです。
 *	- これまで(VC++6.0では)、".CRT$XIU"に配置した変数に対して、明示的な「#pragma comment(linker, "/INCLUDE:〜")」を指定していたのは、clipmisc.hの「#pragma comment(linker, "/INCLUDE:_pmerge_env_option")」だけでした。
 *	  アプリケーションがclipmisc.cモジュール内の関数や変数を使用しない場合でも、常にmerge_env_option()がmain()よりも先にargcとargvを調整する必要が有ったからです。
 *	  それ以外の".CRT$XIU"に配置した変数に対しては、「#pragma comment(linker, "/INCLUDE:〜")」を指定していませんでした。
 *	  アプリケーションが同一モジュール内の変数や関数を使用しない場合は、".CRT$XIU"による初期化も不要だったからです。
 *	- しかし、VS2015では状況が変わりました。
 *	  VS2015のReleaseビルドでは、「/Gy(関数レベルでリンクする)」及び「/OPT:REF(参照されない関数とデータを削除する)」がデフォルトで有効であり、参照されていない関数や変数は、たとえ同一モジュール内の他の関数へ変数が参照されていたとしても、削除されてしまうからです。
 *	  その結果、".CRT$XIU"に配置した変数が削除されてしまい、初期化関数が実行されません。
 *	  この問題については、下記のスレッドでも議論されており、結論としては、VS2012,VS2013,VS2015ではそういう仕様のようです。(下記のスレッド内で解決方法は提示されていません。)
 *	  │Visual Studio and .NET Framework ホーム - Whole program optimization removes (otherwise unreferenced) functions registered with #pragma section(".CRT$XCU")」(https://connect.microsoft.com/VisualStudio/Feedback/Details/1587892)
 *	  尚、VC++6.0では問題が起きなかった理由は、VC++6.0にも上記のオプションは有るのですが、Releaseビルドのデフォルトで無効であるからです。(手元で試した限りではグレーアウトしていて有効にする事も出来ないようでした。)
 *	- VS2015のReleaseビルドでも上記の問題を解決するための対策は、".CRT$XIU"に配置した変数全部について、アプリケーションからインクルードされるヘッダファイル内で、「#pragma comment(linker, "/INCLUDE:〜")」を指定する事です。
 *	  何だか本末転倒なのですが、現在の所、これ以外に方法が判りませんでした。(又は、ソース個別に「/Gy」を無効化する等の方法も有るかも知れませんが、管理上好ましく無いと思うので…)
 *	  この対策はVS2015のReleaseビルドに対してのみ必要なのですが、確実のために全てのビルド(VC++6.0 Debug,VC++6.0 Release,VS2015 Debug,VS2015 Release)に対して有効にしておく事にしました。
 */
#ifndef __CLIP_LIBC_H__
#define __CLIP_LIBC_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/*****************************************************************************
 *	グローバル変数
 *****************************************************************************/
#ifdef  _MSC_VER
extern char* program_invocation_name;		//┬P/ECE環境ならばinclude/errno.hで宣言されている。これらの変数はGNU拡張でありWindows環境のerrno.hには無いので、Windows環境ならばここで宣言する事にした。
extern char* program_invocation_short_name;	//┘
#ifndef _WIN64
#pragma comment(linker, "/INCLUDE:_pinit_program_invocation_name")	//32ビットでは、シンボル名の先頭に'_'が付きます。
#else //_WIN64
#pragma comment(linker, "/INCLUDE:pinit_program_invocation_name")	//64ビットでは、シンボル名の先頭に'_'が付きません。
#endif//_WIN64
#endif//_MSC_VER
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_LIBC_H__
