女子の「頭皮」のお悩み解決の選択肢とは?

静的リンクと動的リンクの違いについて教えてください。

ググって、wikiにて確認したところ、
動的リンクは、実行時にプログラムの結合を行う。
静的リンクは、コンパイル直後の実行ファイル生成時に、ライブラリ等を全てリンクし、必要なコードが全て揃った実行ファイルを生成する。
というのはわかりました。

それを踏まえて、
 (1)-(1)libファイルで静的リンクさせるケース
  メソッドやプロパティのインデックスというかインタフェース仕様のみ書かれている。
  そして、そのインデックスを元にコンパイルチェックを行っている。

 (1)-(2)objファイルで静的リンクさせるケース
  objには、.cppと、.h に書かれている処理のうち、そのソース本体(そのクラス自身のモノとして持っている処理)のプロパティやメソッドのことが機械語で書かれている。
  プロパティやメソッドが書かれているため、当然インタフェース仕様もわかる。

であろうと捉えていますが、この認識で大雑把には合っていますでしょうか?

また、DLLを使う場合、動的リンクとは呼ばれているものの、
「DLLでは、objに加え、必要なリンクの情報まで持っている」と思われるので、
結局、リンカによるリンク実行時に、インタフェースで不整合が起きていないかはチェックされているという認識なのですが、合っていますでしょうか? 
(だとすると、なぜ、ある意味、DLLを使っていても静的リンクなのかなと感じ、動的リンクと呼ぶことに不自然さを感じます)

宜しくお願いいたします。
.

このQ&Aに関連する最新のQ&A

A 回答 (3件)

 (1)-(1)libファイルで静的リンクさせるケース


 (1)-(2)objファイルで静的リンクさせるケース

この2つは大体同じ意味です

[exe ファイル ]
obj を集めて作成します。
main関数が含まれているため、実行すると動作します。
exe ファイルを作成する際、実行されない関数等は含めません

[lib ファイル ]
obj を集めて作成します。
main関数が無い為、実行する事はできません。
当然全ての関数が lib ファイルに含まれます


上記を踏まえて再度
[exe ファイル ]
cpp からコンパイルして作成された obj ファイルや
lib ファイル内のオブジェクトから main からの一連の流れで
使用する関数を集めて exe ファイルを作成します
libファイルにある実行されない関数等は含めません

lib ファイルの中身のオブジェクトが exe の中に存在するので
静的リンクした事になります。


[dll ファイル ]
obj を集めて作成します。
main関数が無い為、実行する事はできません。
当然全ての関数が dll ファイルに含まれます
内容は lib と同じですが動的リンクであるという点が違います。

[dll の lib ファイル ]
dll から 作成する事が出来ます。
その libファイル内には、dll内の同名の関数の情報があり
中身は dllへアクセスする処理があるだけです


上記を踏まえて再度
[exe ファイル ]
cpp からコンパイルして作成された obj ファイルや
lib ファイル内のオブジェクトから main からの一連の流れで
使用する関数を集めて exe ファイルを作成します

exe の中には dll は含まれておりません
その為 exe のファイルサイズは小さく、dll が無ければ動きません
    • good
    • 1
この回答へのお礼

ありがとうございます!

質問に回答して頂けて、凄く助かりました!

しかも各拡張子毎にご説明が分かれていてわかりやすかったです!

お礼日時:2013/07/19 04:15

前提も踏まえた結果も違います。


後段も違います。

最初から勉強し直しましょう。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2013/07/19 04:05

>それを踏まえて、


(略)
>であろうと捉えていますが、この認識で大雑把には合っていますでしょうか?

何をどう踏まえたら、そういう認識にたどり着くのかわかりませんがあってません。
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2013/07/19 04:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QVC++で静的リンクしたアプリを作りたい

Microsoft のVisual Studio 2012 を使用しています。VC++2012 を使用して静的リンクしたアプリケーションを作りたいのですが、静的リンクを行う設定方法がわかりません。言い換えると .Net FrameWork がない環境でも動くアプリケーションを作りたいのです。
詳細は、MSN 相談箱 QNo.8057365(投稿日時 - 2013-04-24 12:53:43)を参照ください。
現在は、次のMSDNの技術資料「Deployment in Visual C++」
http://msdn.microsoft.com/ja-jp/library/dd293574.aspx
に記載されている2番目の方法Local Deployment(ローカル配置)に記載されている必要な DLL ファイルをコピーする方法で実現していますが、Microsoft に相談したところ、次のように言われています。

『VC++ 2012 のLocal Deployment を使ってアプリケーション プログラムの開発を行うのは良いが、一旦開発が成功した後はLocal Deployment の使用を禁止する。』

以上の経緯から、静的リンクした VC++ 2012 アプリケーション プログラムを作る必要があります。具体的な形態は、Windows PE 3 で起動したPC でVC++ 2012 で開発したアプリケーション プログラムを動かします。
Visual Studio 2012 でプロジェクトを定義するとき、「静的リンク アプリケーション」指定の必要があると考えるのですが、その方法がわかりません。どうかご教示をお願いします。

Microsoft のVisual Studio 2012 を使用しています。VC++2012 を使用して静的リンクしたアプリケーションを作りたいのですが、静的リンクを行う設定方法がわかりません。言い換えると .Net FrameWork がない環境でも動くアプリケーションを作りたいのです。
詳細は、MSN 相談箱 QNo.8057365(投稿日時 - 2013-04-24 12:53:43)を参照ください。
現在は、次のMSDNの技術資料「Deployment in Visual C++」
http://msdn.microsoft.com/ja-jp/library/dd293574.aspx
に記載されている2番目の方法Local Deployment(ロ...続きを読む

Aベストアンサー

>(1)静的リンク=マルチスレッド の発想ができません。キーワードを指定してのヘルプ検索のヒントをご教示ください。

VCの以前からの流儀…ですからねぇ…。
「VC 静的リンク」で検索するとランタイムライブラリの設定を変更する。と紹介されているページが見つかるでしょう。
で、設定を変更する際のメニューなどの操作手順を解説しているページも見つかるかと。
ネット上に情報はあるのですから、そのように「調べる手順」は身につけておいた方がいいかと。

>(2)「上級者用の設定」の文言も気がかりです。見つけ方を教えてください。

VS2010の頃はあったのですが、VS2012でも存在するのかどうかは不明です。
MicrosoftのサイトだとVS2012 ExpressEditionにはあるかのような記述がありましたが、
手元の「VS Express for Desktop」には無いんですよねぇ…。
# http://msdn.microsoft.com/ja-jp/library/vstudio/038tzxdw.aspx の
# 「1.[デバッグ] メニューの [例外] をクリックします」にあるメモに。

>(3)良い参考書があればご教示ください。

人によって変わるでしょうから本屋で立ち読みしながら探して下さい。としか言えないですね。
ただし、今回の場合はMFC(ExpressEditionにはない)ならともかく.NET Frameworkは使えませんので、少々古いバージョン辺りの本になるかも知れません。
.NET Frameworkメインで記述されている本では今回の目的には沿わないでしょう。
# Win32APIプログラミングとかそういうのでしょうかね…。

私の環境にはVS Express for Desktopはインストールしてありますが…
もっぱら使っているのはVS2010 ExpressEdition(C++かC#)です。
MFCが必要とかの場合は製品版を所持しているVS2005になってしまいますが。
そんなワケで2012はほとんど使っていません。
# メイン環境もまだWindows7ですし。(仕事中はXPですからVS2012も動きませんしね)

>(1)静的リンク=マルチスレッド の発想ができません。キーワードを指定してのヘルプ検索のヒントをご教示ください。

VCの以前からの流儀…ですからねぇ…。
「VC 静的リンク」で検索するとランタイムライブラリの設定を変更する。と紹介されているページが見つかるでしょう。
で、設定を変更する際のメニューなどの操作手順を解説しているページも見つかるかと。
ネット上に情報はあるのですから、そのように「調べる手順」は身につけておいた方がいいかと。

>(2)「上級者用の設定」の文言も気がかりです。見つけ...続きを読む

Qdllかlibか

自作のライブラリの場合は任意で
ユーザーが任意のプラグイン読み込めるアプリなら
プラグインに関してはdllでしょうが

公共的なライブラリについて
動的ロード推奨か、静的リンクでもいいという線引はどのあたりなのでしょうか

現状では

ole32.dll
msimg32.dll
comctl32.dll
comdlg32.dll
dsound.dll
kernel32.dll
shlwapi.dll
shell32.dll
uxtheme.dll

を動的にロードし

winmm.lib
user32.lib
gdi32.lib

を静的にリンクしています。
kernel32とかはさすがに静的リンクでもOKでしょうか?
あるいはwinmmとかは動的な方がいいでしょうか?

なお、対象はWindowsでXP以降とする場合、です。
(Windows以外の場合も教えていただけるとより良いですが)

あと、dsound.dll
とかについてですが

DirectSoundCreate8
だけGetProcAddressすれば

あとの

struct IDirectSound8;
struct IDirectSoundBuffer8;

のメンバなどについてはGetProcAddressしなくても使えるようだし
リンクエラーにならないのですが、これはどんな感じの仕組みになっているのでしょうか?

あるいは、それを気にしなくてもこれは「そうやっておけば問題ない」
としておいてもいいようなものなのでしょうか?

自作のライブラリの場合は任意で
ユーザーが任意のプラグイン読み込めるアプリなら
プラグインに関してはdllでしょうが

公共的なライブラリについて
動的ロード推奨か、静的リンクでもいいという線引はどのあたりなのでしょうか

現状では

ole32.dll
msimg32.dll
comctl32.dll
comdlg32.dll
dsound.dll
kernel32.dll
shlwapi.dll
shell32.dll
uxtheme.dll

を動的にロードし

winmm.lib
user32.lib
gdi32.lib

を静的にリンクしています。
kernel32とかはさすがに静的リンクでもOKでしょうか?
あるいはwinmmと...続きを読む

Aベストアンサー

#1です。#1に書いた補足の所の回答をします。

・実行速度の件
アセンブラコードを見ると判るのですが、動的リンクの場合は、DLLに対応するジャンプテーブルが、コード領域の最後に作られるらしく、一度そちらにジャンプしてからDLLのコードに飛んでいきます。
それに対して、(実証したことがないので推測ですが)静的リンクの場合は自EXE内に既にコードが展開されるので、直接ジャンプしているものと推測しています。(どこにあるか判るのでジャンプテーブルは必要ないはず)
なので、若干静的リンクが早いとは思いますが、正直ループで1万回まわしてどれだけ差が出るの?って感じ程度だと思います。
キャッシュミスを考えても、そもそもコード量>1次命令キャッシュがほとんどですから、どっちにしろコード量が大きければ、静的リンクも動的リンクも同じくらいヒットしたりミスしたりするとおもいますが。
動的DLL部分だから違うキャッシュ空間を使う、というわけでもありませんからね。DLLのコードの位置が、ちょっと離れているか、自EXE内にあるか、というだけで、そもそもキャッシュは関数レベルでリードしているわけではありませんから、どっちもどっちかと思いますよ。
ただ、前述のジャンプテーブルの分だけ、動的リンクの方がキャッシュを使いつぶしやすいでしょうけど。

・アップグレード権うんぬんの話
これについては、たしかにインストール時に必要なパッチをインストールさせる手もありますね。
ただし、そのEXEをCDやDVDに入れないといけないですが。
また、そこに至るまでの前提パッチ全て入れる必要もあります。
(このあたりのパッチの依存関係を調べるのは大変じゃないですかね・・・?)

・TrackMouseEventの件
さすがに、プラットフォームSDKのヘッダに記載されている名称そのままはぶつかりますので使えません。
ですが、LoadLibraryとGetProcAddress()を使っているなら、その取得したアドレスをポインタに格納すれば名称変更で同じことができると思いますが。
  typedef BOOL (*LOADADDR_TRACKMOUSEEVENT)( LPTRACKMOUSEEVENT lpEventTrack );

  LOADADDR_TRACKMOUSEEVENT pTrackMouseEvent = (LOADADDR_TRACKMOUSEEVENT )GetProcAddress(~);

  LPTRACKMOUSEEVENT event;
  BOOL brc = pTrackEvent( &event );

こんな感じでいけると思います。これで、”TrackMouseEvent”を、”pTrackMouseEvent”と置換するだけで済むかと。


・#2さんのお礼の所にあったLIBの話
自分の所ではないのですが、思ったことが1つあったので、書いておきます。

たしかに、libの中にコードが入っているコンパイラもあります。
私も使ったことはあります。自分の担当分をlib化してコードを1つにしておいて、後で他人の作ったLIBと合わせて1本にする、という用法です。

ただし、Windowsの開発環境の場合は、LIBにコードは含まれていないはずなのですが。
主さんがLIB=静的リンク、と言っているのは、上記の通り、そういう環境で開発したことがあるからではないかな、と推測しますが、どうでしょうか?

私が認識している感じでは、winmm.lib等、プラットフォームSDKに入っているlibは、あくまでこれに対応するDLLに格納している関数名とその引数の数やオフセットアドレス位しか格納していないと思いました。

なので、まとめてしまうと、Windowsの場合に限っていえば、静的リンクはDLLのコードごとEXEに組み込むことを指し、動的リンクはEXE実行時にDLLをロードして使う(LIBを使ってコンパイル・リンクして、自動でロードさせる)、または、EXE側でLoadLibrary+GetProcAddressで使うことを指す、ということになります。

なお、#pragma comment( lib, "winmm.lib" )は、主さんの書いている通り、追加の依存関係に書くのと同じです。
(なので、私も1箇所でしか使っていない場合とか、他人に流用させることを意識したソースコードの場合は#pragmaを使います)

・必要DLLが無い環境でのEXE実行の件
d3dx9.dllの話を出していますが、主さんの書いており通り、d3dx9.libに対応するDLLがなければEXEは起動できませんので、通常はこのDLLが無い環境にインストールされるかもしれないと想定される場合は、インストーラーでインストールして導入させる必要があります。

何でもいいのですが、アプリをインストールしていて、インストーラーからインストーラーを起動する光景をみたことはありませんか?
もしくは、ゲームのインストーラーに必ずと言って良い位、DirectXのインストーラーもついて来ます。これを入れないと動かないぞと言わんばかりです。
つまり、導入しないなら使えない、使いたいなら前提となるDLLをインストールしてください、というのが動的リンクを使ったEXEを使う場合の前提です。ただし、これをやると以降のバージョンUPの際は、EXE入れ替えのみで済むという手抜きアップグレードができたりします。(普通やらないでしょうけど)
これがいやな場合は、静的リンクにするしかありません。無いものは自前で用意する、という感じですね。

・静的リンクのアプリの作り方
すいませんが、静的リンクはMFCでしかやったことがないので、他のDLLの静的リンクの方法はわかりません。
MFCのDLLの場合は、プロジェクト設定時に指定できるので、スイッチポンで指定できるのですが・・・他のは設定がありませんね。もしかしたら、自分でリンカの所にオプションを追加するのかもしれません。

#1です。#1に書いた補足の所の回答をします。

・実行速度の件
アセンブラコードを見ると判るのですが、動的リンクの場合は、DLLに対応するジャンプテーブルが、コード領域の最後に作られるらしく、一度そちらにジャンプしてからDLLのコードに飛んでいきます。
それに対して、(実証したことがないので推測ですが)静的リンクの場合は自EXE内に既にコードが展開されるので、直接ジャンプしているものと推測しています。(どこにあるか判るのでジャンプテーブルは必要ないはず)
なので、若干静的リンクが早いとは...続きを読む

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QDLLのスタティックリンクは可能?

C言語(C++)で、スタティックライブラリと同じ要領でDLLをEXEに含めることはできるでしょうか?
環境は、BCC5.5とVC2005の両方でお願いします。

Aベストアンサー

できないです。
トリッキーな方法で、
DLLのバイナリデータをEXEファイルに含ませたり(リソースファイルを使ったり)とかすれば可能かもしれませんが・・・:-(

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qライブラリ、.libとは?

ライブラリと検索すると、標準ライブラリばかり出てきて「○○.lib」のことがいまいち見えてこないのですが、このファイルはどういったものなのでしょうか。
.h、.c、.cppなどでは代用が利かないものなのでしょうか。

あと、C、C++にはライブラリと言うものがあり、あると便利・・・
というのは何となく分かるのですが、
1.ライブラリを配布しているのをあまり見ませんが、どこかまとまって置いてある場所はあるのでしょうか。
2.あまり記載されている参考書が見当たりませんが、どのように使うものなのでしょうか。
3.「このライブラリはどういうものか覚えていた方がいい」というものはありますでしょうか。

この3点について教えていただけるとありがたいです。
よろしくお願いいたします。

Aベストアンサー

>1.ライブラリを配布しているのをあまり見ませんが、
>どこかまとまって置いてある場所はあるのでしょうか。
なんのライブラリのことでしょうか?
ライブラリとは汎用性の高い関数や機能を再利用可能な形にした物を
言います。これは、目的によってプログラマが作ったり、
既に公開されたりしているものもあります。

>2.あまり記載されている参考書が見当たりませんが、
>どのように使うものなのでしょうか。
ライブラリの作りはそれを使う環境にも依存しますが、
Windows環境の場合、Libファイルにはダイナミックリンクライブラリ
(DLL)とスタティックリンクライブラリという2種類が存在します。
Libファイル(***.lib)はDLLの場合、そのライブラリが提供している
関数の関数名などの外部参照用のデータが入っています。
そして、実行には使用したLIBファイルのバイナリデータが入った
DLLファイル(***.dll)が必要です。
スタティックリンクライブラリのLibファイルは、それ自体に
ライブラリのバイナリが含まれており、使う場合はその使ったアプリ
にバイナリとして埋め込まれます。
なので、実行時にDLLファイルは必要ありません。

>3.「このライブラリはどういうものか覚えていた方がいい」
>というものはありますでしょうか。
ライブラリについては特に覚えることは多くありませんし
自分でライブラリを作るなら覚えて損はありません。
むしろ、覚えなくてはいけないのは、ライブラリにした場合に
どのようなことに注意するかです。
ライブラリの扱いは上には上にも書いたとおり、環境に依存する
ところがあるため、使用する環境に応じてある程度作り方が
違ってきます。

>1.ライブラリを配布しているのをあまり見ませんが、
>どこかまとまって置いてある場所はあるのでしょうか。
なんのライブラリのことでしょうか?
ライブラリとは汎用性の高い関数や機能を再利用可能な形にした物を
言います。これは、目的によってプログラマが作ったり、
既に公開されたりしているものもあります。

>2.あまり記載されている参考書が見当たりませんが、
>どのように使うものなのでしょうか。
ライブラリの作りはそれを使う環境にも依存しますが、
Windows環境の場合、Libファイルに...続きを読む

QC++とVC++の違いについて

この質問をご覧頂きありがとうございます。

みなさんに2つ、お聞きしたいことがあり、質問させていただきます。
1.C++とVC++とでは、どのくらいの違い(どういう違い、特徴)があるのでしょうか?

2.また、これからC++/VC++でプログラミングを始めようとした場合、
C++からVC++へと段階を踏んで勉強した方がよいのでしょうか?

一応、私のプログラミングの履歴としては、
言語としてVisual Basicは多少勉強はしておりました。
また、オブジェクト指向の基礎程度(多相、継承、カプセル化)は理解しています。

抽象的な質問で大変恐縮なのですが、
みなさんの経験論や、ご参考にした本、HP等がありましたら、
ご教授いただければと思います。

Aベストアンサー

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いですが、VC++とMFCを使用してウインドウアプリケーションを作りたいという事であれば、死に物狂いな勉強が必要が必要かもしれません。Windowアプリケーションの処理プロセスを理解していないと、とっても難解に感じると思います。
 VC++でなければいや!という理由がなく、Visual Basicからスムーズに移行でき、かつVisual Basicより奥の深い事をしたい、というならば C++ Builder をお勧めします。 こちらで腕を慣らし、徐々にWindowアプリケーションの処理プロセス(WinMainから始まるプログラムの組み方の事です)を学ぶと良いかな、と思います。 その上で VC++&MFCな環境に移行すると、敷居はぐっと低くなります。
 私は一度VC++&MFCに挫折しましたが、こちらの方法で何とか理解する事が出来ました(^^;

 参考になれば幸いです(..
 

こんにちは、honiyonです。
 VC++ は、Microsoftの発売している C++開発環境です。 純正C++に加え、独自に機能(という言い方でいいのかな?)を追加しており、更に開発しやすいソフト(環境)を添付してあります。

 VC++に限らず、大体はそうです。 ProC++も、Borland C++も皆そうです。
 今までお使いになっていた VBも、BASICコンパイラ+開発環境です。 
 こちらの場合、BASICに機能を追加・・・というより仕様そのものを大幅いじってますね(笑)

 VC++をただ単純に C++として使用するなら良いで...続きを読む

Qインポートライブラリ(.lib)ファイルについて

インポートライブラリファイル(.lib)とは
何を行うファイルなのでしょうか。
外部DLLを使用可能にするためのファイルでしょうか。
libファイルの意味、使用方法を教えてください。

Aベストアンサー

そのとおりです。間接的にリンクできる関数はDLLにあって、実行時にリンクすることがあります。DLLの関数群を直接コールすることもできるはずですが、それらの関数をコールするための手続きをインポートライブラリとして用意しておくことが多いようです。

どうも、間違ってはいないんだけど、いまいちつかめないといった感じですね。

実行ファイルの中に入っているのが直接リンクした関数で、実行時にリンクされるのが間接的にリンクする関数と言うことになるでしょう。

C++ Builder5のことはよくわかりません。ごめんなさい。

Q初級者の質問――time_tについて

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と説明しています。
「じゃあ、カレンダー時間って何?」と思いますが、「カレンダー時間」というものの説明は見当たりません。

time_tというのは整数と考えてよいのでしょうか。
time_tで変数宣言すると、プログラムを読む人が「あ、これは時間を表すんだな」とわかり易いから、time_tというものがあるのでしょうか。

それとも、
time_tが秒数を表すかどうかは処理系に依存するのでしょうか。

もし、1970年1月1日からの秒数を表すなら、time関数の戻り値を1年間の秒数で割って1970に足せば今何年かわかるプログラムになりそうですよね。(うるう年や時差は考慮する)
それとも、それは処理系によっては正しく動かないプログラムになるのでしょうか。
(あくまでも考え方です。確か、time_tを渡せば年月日時分秒を返す関数があると思います。)



ちなみに、おとといプログラムを作ってtime関数の戻り値を10進数で表示すると次のようになりました。(VC++)


==============プログラム==============

#include <stdio.h>
#include <time.h>

int main(void)
{
time_t a;
a=time(NULL);
printf("%d\n",a);

return(0);
}

================結果===============

1005300371

私はC言語の初級者です。

time関数というのは現在時刻をtime_t型で返すものですよね。
でも、私はこの意味がよくわかりません。

time_t型とは何でしょうか。

単なる整数なのでしょうか。
確か、time_t型というのは整数で、
1970年1月1日0時からの秒数(世界標準時)だと聞いた気がします。

しかし、(いくつか見てみましたが)大抵のC言語の本では、そういう説明はしていません。
「プログラミング言語C」(カーニハン、リッチー)という本では、
「timeは現在のカレンダー時間を返す。」
と...続きを読む

Aベストアンサー

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0時0分0秒からの経過秒数」というのは慣例に過ぎません。

とはいえ、UNIXを起源とする『time_tはlong』と『time()は1970年1月1日0時0分0秒からの経過秒数』という約束事は変えられる事は無いでしょう。
C98/C89との互換性を保ちながら新規格を作ることが予想されるからです(そうでなければlong longなどという型は作らないはず)。
その意味でyoushirさんのおっしゃるとおりだと思います。

> C99とは、ISOの規格で比較的新しいものと思います。

そうです。
正式にはISO/IEC 9899:1999です。

> (C98というのは知りませんでした。)
失礼しました。
C89の間違いです。
同様にISO/IEC 9899:1989です。

> しかし、時間の起点が2000年1月1日であっても、秒数でなくて日数であっても、かまわないのでしょうか
時間の起点(というか、時間の管理方法)は time()の管轄であり、型であるtime_tは「time()が返す値を表現できること」が要求されているに過ぎません。
また、「1970年1月1日0...続きを読む


人気Q&Aランキング

おすすめ情報