トップページ⇒tech
1001コメント303KB

C++相談室 part7

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
(´∀`).。o(関連URLは>>2-5の辺り)
0002デフォルトの名無しさんNGNG
Boost
http://www.boost.org/
STLport
http://www.stlport.org/


過去ログ
Part1
http://piza.2ch.net/tech/kako/980/980175292.html
Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/
Part4
http://pc.2ch.net/test/read.cgi/tech/1009071535/
Part5
http://pc.2ch.net/test/read.cgi/tech/1014217496/
part6
http://pc.2ch.net/test/read.cgi/tech/1018454705/


Windowsの話はこちらで

Win32API 質問箱 Build3
http://pc.2ch.net/test/read.cgi/tech/1017072275/
Windows Programing for C/C++(Not MFC)
http://pc.2ch.net/test/read.cgi/tech/1018239290/


キタ?

C++ Final Draft International Standard
http://www.kuzbass.ru/docs/isocpp/

v(^▽^)v
Loki
http://www.moderncppdesign.com/
0003デフォルトの名無しさんNGNG

VisualC++相談室 【7】
http://pc.2ch.net/test/read.cgi/tech/1017843192/
0004デフォルトの名無しさんNGNG
>>1
乙彼
0005デフォルトの名無しさんNGNG
(・∀・) オツカレ-
0006デフォルトの名無しさんNGNG
>>1
http://www.cis.temple.edu/~ingargio/refman.pdf
次からはこれもテンプレよろしく
0007デフォルトの名無しさんNGNG
v(^・^)v
0008デフォルトの名無しさんNGNG
>>6
そこ、Forbiddenになっちゃうんだけど。俺だけ?
0009デフォルトの名無しさんNGNG
http://photon.poly.edu/~hbr/cs903/c++/C++-ansi.pdf
じゃぁ、ここをどうぞ
0010デフォルトの名無しさんNGNG
C++的にはクラスを名前空間代わりに利用するのってアリなんでしょうか?
自分の算術クラスを見てみたら、

class xMath {
private:
 xMath(const xMath&);
 operator=(const xMath&);
 ~xMath();
private:
 inline static 〜
 inline static 〜
};

こんな風になってたんだけど・・・
namespaceで書き直した方がいいですか?
0011デフォルトの名無しさんNGNG
age
0012デフォルトの名無しさんNGNG
VC++使ってます。
下のソース、メンバ関数Fの宣言と定義を同時にやらないと通らないのですが、
下に書いたように分離するのは仕様違反なのでしょうか?

struct S
{
 typedef char type;
};

template<typename T>
class C {
public:
 typedef T type;
 static void F(type::type* p);
};

template<typename T>
void C<T>::F(type::type* p)
{
 p;
}

S::type a;
C<S>::F(&a);
0013デフォルトの名無しさんNGNG
クラス内はある種の名前空間で区切られているけど
普通の名前空間で済む話なら普通のでいんじゃない?
0014デフォルトの名無しさんNGNG
>>12
標準仕様では OK のはず。ただし、type::type の前に typename が
必要だと思うけど。VC++ は template 機能が貧弱だから。
0015デフォルトの名無しさんNGNG
typedef true T;
typedef false F;
とするとエラーになるんですが、だめなんでしょうか?

0016デフォルトの名無しさんNGNG
true/false は型じゃないぞよ
001716NGNG
つか、true/false に別名をつけようとしてる時点で終わってるな…
001816NGNG
そうか、C とかからの移植作業ならそれもアリだな…
一人相撲つかれた。逝ってくる
0019デフォルトの名無しさんNGNG
ん、ありなのか?
0020デフォルトの名無しさんNGNG
>>16, サンクス〜
型の時がtypedef で上の場合は#define使うのか。
typedef TRUE T;
が通ってたので勘違いしてました。
0021デフォルトの名無しさんNGNG
template<typename T> class CTest
{ friend bool operator ==(const Test<T>& t1,const Test<T>& t2); };
//CTestをcharに特殊化
template<> class CTest<char>
{ friend bool operator ==(const Test<char>& t1,const Test<char>& t2); };

上の二つのクラスに、別々のoperator == をつけようと思い、
(1)か(2)の方法でクラス外で定義して、クラスにはfriendで実装
しようと思ったのですが、どちらもエラーになります。
これは不可能なことなのでしょうか?

(1)クラス外の関数の特殊化を試みる > Error!
template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2)
{return true;}

template <> bool operator ==(const Test<char>& t1,const Test<char>& t2)
{return true;}

(2)別々に operator を作る。 > Error!
  (クラス外定義なのでオーバーロードできないみたい)
bool operator ==(const Test<int>& t1,const Test<int>& t2)
{return true;}

bool operator ==(const Test<char>& t1,const Test<char>& t2)
{return true;}
002221NGNG
なんか勘違いしてました。
(2)はOKです。なんか違うエラーみたいでした。
0023デフォルトの名無しさんNGNG
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数:105420人 発行日:2002/05/020

どもども、ちょっぴりワキガのひろゆきですー。
いやぁ、もうすぐですねー、谷澤動物病院の裁判の判決ですー。。。

おいらはいつものとおり、
「投稿者がわからないので勝手に削除は出来ない」
「勝手に削除したら投稿者に訴えられてしまうかも知れないから削除は出来ない」
との主張を繰り返してきたんですけど、裁判官てば実に冷ややかな目でおいらを見るんですよー。。。
その上、
「削除出来ないんじゃなくてするつもりがないんじゃないですか?」
「悪質な書き込みをむしろ売り物にしてるんじゃないですか?」
「発信者を特定出来るようにようにしてから能書きを語るったらどうですか?」
なんて嘲りの笑みを浮かべながら言うんですよー。。。
本当に憎らしい奴ですー、、うぅうぅ、、

ところで、谷澤動物病院てば、おいらのことを訴えてから客が2割も減ってしまったそうですー。。。
おいらのことを訴えると被害が余計に拡大するってことですね。。。えへへ。。。

んじゃ!
0024デフォルトの名無しさんNGNG
>>21

仮引数のTestって?
CTestじゃないの?
0025デフォルトの名無しさんNGNG
>>21
使ってるコンパイラは何?
002621NGNG
>>24
ミスって書き込んでました。どっちかに統一して見て。
>>25
VC.NET と VC6
でちょっと変えて実験してみたところ、VC.NETは下のはコンパイルできませんでした。
VC6の場合はコンパイルするのになんかコツがいるみたい。(^^;
(場所1から場所2)をコメントアウトして
一度ビルドして、コメントをはずして、改行を入れると、なぜかコンパイルできる。
やっぱり、operator == 系の特殊化は無理なのかな。

template<typename T> class Test :public T
{
friend bool operator ==(const Test<T>& t1,const Test<T>& t2);
};

template<> class Test<CString>
{
public:
friend bool operator ==(const Test<CString>& t1,const Test<CString>& t2);
};

template<> class Test<CWnd>
{
public:
friend bool operator ==(const Test<CWnd>& t1,const Test<CWnd>& t2);
};

template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2)
{
return true;
}

//****場所1

bool operator ==(const Test<CString>& t1,const Test<CString>& t2)
{
return true;
}

bool operator ==(const Test<CWnd>& t1,const Test<CWnd>& t2)
{
return true;
}

//******場所2


0027デフォルトの名無しさんNGNG
// これならコンパイルできると思う >>26

#include <iostream>

template<typename T> class Test;
template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2);
template<> bool operator ==(const Test<int>& t1,const Test<int>& t2);

template<typename T> class Test
{
friend bool operator ==(const Test<T>& t1,const Test<T>& t2);
};

template<> class Test<int>
{
friend bool operator ==(const Test<int>& t1,const Test<int>& t2);
};


template <typename T> bool operator ==(const Test<T>& t1,const Test<T>& t2)
{
std::cout << "template" << std::endl;
return true;
}

template<> bool operator ==(const Test<int>& t1,const Test<int>& t2)
{
std::cout << "specialization for int" << std::endl;
return true;
}

int main()
{
Test<int>() == Test<int>();
return 0;
}
0028デフォルトの名無しさんNGNG
クラスのプリフィックスってどんなのつけてます?

ちなみに
メンバにはm_
静的変数にはg_
intにはn
charにはc
shortにはs
longにはl
unsignedにはu
とか付けてます。
0029デフォルトの名無しさんNGNG
>>28
メンバは m_
static は s_
global は g_
あとは普通は型に対応させたりはしない。名前からだいたい分かるようにしてる
(〜Nameなら文字列(std::string)だろう、〜Counterなら整数だろう、とか)

しかしメンバは m_ とかかったるいので
postfix で _ というのも少しすっきりして良さそうな気もしてきてる
0030デフォルトの名無しさんNGNG
あ、そうね
プレフィックス付けた方が見やすいか・・・
気をつけよう。

# サフィックスでもいいのかな?
0031デフォルトの名無しさんNGNG
ポインタにpはつけてるな。
m_はでかいクラスで、引数と名前の衝突が起こりそうなとき。
pXxx;
m_pXxxx;
0032デフォルトの名無しさんNGNG
MFCとかだとクラスの名前の先頭にCがついてますよね。
あとBuilderやDelphiなんかはTだとか。

>30
サフィックスって後ろに付けるということですよね?
それだと一目でわかりにくいような…。
0033デフォルトの名無しさんNGNG
>>32
メンバ変数にアンダーバーをつけるなら、プレフィクス(前につける)は
マズい。それはC++の禁じ手。アンダーバーで済ませるなら、必ず
ポストフィクス(後ろにつける)で。

俺は、テンプレートクラス名の先頭にはT、例外クラスの先頭にはE、
それ以外のクラス名の先頭にはC、ってやってるなー。
インターフェースクラスの先頭をIにするかどうかは、いつも脳内会議中。

あと、char,short,longで区別じゃなくて、1バイト、2バイト、4バイトで
区別する、int8,int16,int32(もしくはBYTE,WORD,DWORD)をやってる。
0034デフォルトの名無しさんNGNG
純粋な構造体としてのstructやenumには何かつける?

structはS enumはEとかつけようと思っても、
なんか最後の方でみんな取っちゃったりして。
0035デフォルトの名無しさんNGNG
無修飾派。
MFC使ってるときは C とかVCL使ってるときは T とか付けたりするときもあるけど、基本は無修飾っす。鬱陶しいし。賛成の人?
0036デフォルトの名無しさんNGNG
俺の場合、普通のクラスにはC、インターフェースクラスにはIを先頭につけた大文字小文字混じり。
structやenumには特につけない。
で、メンバやグローバル変数は大文字小文字を使って、ローカル変数は小文字のみ。
003733NGNG
>>34
構造体はSで始まるってイメージがないよなぁ。
size_t にしたがって、イメージがわきやすい「_t」を使ってる。
それにならって、enumは「_e」をつけてる。
0038デフォルトの名無しさんNGNG
>33
すんません。
プリフィックスにアンダーバーを付けるとマズい(あるいは禁じ手)なのはなぜなんでしょう?

そういや、winだと標準で
INT8
INT16
INT32
UINT8
UINT16
UINT32
って用意されてますね。
0039デフォルトの名無しさんNGNG
>>38
処理系(コンパイラベンダーなど)のために予約されている。
つまりはコンパイラのバージョンアップなどで _ で始まる新たな予約語などを
追加していいように、ユーザーはその名前を使わないようにとの決まり。
0040デフォルトの名無しさんNGNG
>39
ああ、そういうことですか。
それはそうですね。
知ってました。
要するに
×  _xXxxx
ですよね?
m_xXxxxがダメなのかと勘違いしてました。(w

デファインはよくアンダーバーを2回並べますが…。
0041デフォルトの名無しさんNGNG
>>40
__ も予約されてるので駄目
0042デフォルトの名無しさんNGNG
ついでにいえば、アンダースコアで始まる任意の名前 (つまり先頭にアンダー
スコアがいくつ並んでもよい) は、実装用に予約されている
0043デフォルトの名無しさんNGNG
#define INC__HOGE_H
とか途中にアンダースコア2つもアウトだっけ。
0044デフォルトの名無しさんNGNG
途中は問題ない
0045デフォルトの名無しさんNGNG
クラスにいちいちCを付けるのは、個人的にちとダサイ気がするなぁ…。
ほとんどがクラスな訳だし、VCだとインテリセンスに掛かりづらいし。
むしろc的な使い方と両方やっている人が、区別のためにしてるのかな。

あとGoF本だと、メンバ変数のプレフィックスに _ 付けまくってるね。
あれは、可読性を高めるためにあえてやっているだけなのか、
それとも普段のソースそのものなのか…。
0046なぜ?NGNG
以下のプログラムで、ストリームの状態のテスト
をしたいのですが、アルファベットを入力して
else節を実行しようとすると、無限ループになって
しまいます。何故に、cin >> i のところで次の入力
待ちになってくれないのでしょうか?
Borland C++ Compiler 5.5.1 と VC6.0 です。
OS はWin95

#include <iostream>
#include <string>
using namespace std;

int main()
{
int i;
cout << "整数を入力してください" << endl;
while(1){
if(cin >> i){
cout << i << ":読み込みに成功しました" << endl;
cout << "状態フラグ:" << cin.rdstate() << endl;
if(i == 0) break;
}
else{
cout << "読み込みに失敗しました" << endl;
cout << "状態フラグ:" << cin.rdstate() << endl;
cin.clear();
}
}
}
0047デフォルトの名無しさんNGNG
ライブラリに入れちゃう一般化したクラスにはオリジナルの(漏れの場合はK)prefixつけてるな。
それ以外は、インターフェース(抽象クラス)にはIをつけるだけで、あとはつけない。
0048デフォルトの名無しさんNGNG
すいません、激しく初心者で申し訳ないんですが
BorladC++のコンソールウィザードとやらで
簡単なプログラムを組んでみたんですけど、
自分のマシン以外だと「CC3250.DLL」が無いから動かないと言われます。
VCLを選んだら、VCL50が無いと言われました。
exeだけで、Win環境ならどこでも動くようにするのは
どうしればいいのでしょうか?
0049デフォルトの名無しさんNGNG
>>48
プロジェクト→オプション→パッケージ→実行時パッケージを使って構築
プロジェクト→オプション→リンカ→共有RTLDLLを使う
この2つ共のチェックを外してコンパイル
0050sageNGNG
スマソ。BCCね 
コンパイラオプションで上と同じように設定できると思われ
005148NGNG
できましたー。ありがとうございます。
容量もそれらしく増えました。どーも8KBは変だと思ってました。
005226NGNG
>>27
やはり無理でした。
VC++.NETのMSDNのDeepC++ やテンプレートをいろいろ調べたところ。
次のようにするとスマートに解決できました。

enum TypeM
{
type_default = 0,
type_cstring = 1,
type_cwnd = 2
};

template<typename T,enum TypeM type=type_default> class Test :public T
{
public:
friend bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2);
};

template<> class Test<CString>
{
public:
//friendの特殊化は無理みたい。>コンパイルできるが呼べない。
};

template<> class Test<CWnd>
{
public:
//friendの特殊化は無理みたい。>コンパイルできるが呼べない。
};

template <typename T,enum TypeM type> bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2)
{
//typeは定数なので最適化時にswitchステートメントからは1つの関数が得られる。
//これがtemplateの最も優れた性質なのです。(MSDN参照)
switch(type)
{
case(type_cstring):
AfxMessageBox("CString");
break;
case(type_cwnd):
AfxMessageBox("CWnd");
break;
default:
AfxMessageBox("Default");
break;
}
return true;
}
0053デフォルトの名無しさんNGNG
>>46
アルファベットは数字ではないので、int の i には読み込めないので、読み込まれずにいつまでも cin の中に残ってるから。
0054デフォルトの名無しさんNGNG
int i;を
char c;にして
if(i==1) を if(c == '1')にする。
キーボードの 1 は文字で認識しないとだめ。
0055デフォルトの名無しさんNGNG
>>53
>アルファベットは数字ではないので、
文字コードってご存じ?
0056デフォルトの名無しさんNGNG
>>46
cin.clear(); の後に cin.ignore(); を呼ぶ。

>>55
?
0057デフォルトの名無しさんNGNG
>>52
それだと Test<CString> には friend 関数が宣言されていないことに
なっちゃうけど…
0058デフォルトの名無しさんNGNG
一画面に多くの行が収まり、全体の把握が楽なので、
今までこうコーディングしてました。

void func(){
  //statement
}

しかし、ネット上で見かけるソースや、マイクロソフト関連の
サンプルをみると、最近ほとんどがこうです。

void func()
{
  //statement
}

やはり後者が主流なのでしょうか?会社に入った場合はどちらが役に
立ちますか?くだらない質問ですが真剣です。ご教授頂ければ幸いです。
0059デフォルトの名無しさんNGNG
>>58
クラス定義内のインライン関数なら前者の書き方でよいと思うが、
通常の関数定義は後者の方がよいと思う。
複雑な仮引数やtemplate文になると、頭だけで2行以上使うことも
あるぞ。
0060なぜ?NGNG
すごい、cin.ignore()で上手くいった。
でも、これは何ですか?
cin.clear()でfailbitクリアするだけでは
駄目なんですか?
でも、ありがとうございました。うれしいです。
0061 NGNG
テスト
0062デフォルトの名無しさんNGNG
>>60
いや・・・・i に入れられなかったアルファベットがストリームに残った
ままになって永久ループするからだろ。ignore()はストリームをクリア
してくれる。
0063デフォルトの名無しさんNGNG
>>62
・・・とと。ignore()は一文字だけ読みとるので、複数文字をいれると、
その一文字ずつメッセージが出てくるはず。
0064デフォルトの名無しさんNGNG
>>59
レスありがとうございます。今までそういうのは

template<class T>
class<T>::func( int long_long_so_long_argment
          int long_long_too_long_argment
          char iikagennni_siro_argment  ){
  //statement
}
こんな感じにしてました。やはり就職すると、
最初の { の位置を書き直すよう、指導されたりするのでしょうか?
0065デフォルトの名無しさんNGNG
>>64
たかが{の位置くらいで悩むな
そんなことで文句を言う会社なんてクソだから就職するな
0066デフォルトの名無しさんNGNG
>>57
その通りみたいです。これでOKだと思う。
これでやっとoperator使える〜YO〜
/* 部分特殊化を使う operator== test*/
Test<CDialog,type_default> s1,s2;
s1.CmnTest();
if(s1 == s2){}
Test<CString,type_cstring> w1,w2;
w1.CmnTest();
if(w1 == w2){}
Test<CWnd,type_cwnd> o1,o2;
o1.CmnTest();
if(o1 == o2){}
/*この下はヘッダー*/
enum TypeM{
type_default,type_cstring,type_cwnd
};

template<typename T,TypeM type> class Test :public T
{
public:
friend bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2);
void CmnTest() const
{AfxMessageBox("Default--CmnTest()");}
};
template<> class Test<CString,type_cstring> :public CString
{
public:
friend bool operator ==(const Test<T,type_cstring>& t1,const Test<T,type_cstring>& t2);
void CmnTest() const
{AfxMessageBox("CString--CmnTest()");}
};
template<> class Test<CWnd,type_cwnd> :public CWnd
{
public:
friend bool operator ==(const Test<T,type_cwnd>& t1,const Test<T,type_cwnd>& t2);
void CmnTest() const
{AfxMessageBox("CWnd--CmnTest()");}
};
template <typename T,TypeM type> bool operator ==(const Test<T,type>& t1,const Test<T,type>& t2)
{
//typeは定数なので最適化時にswitchステートメントからは1つの関数が得られる。
//これがtemplateの最も優れた性質なのです。(MSDN参照)
switch(type)
{
case(type_cstring):
AfxMessageBox("CString--operator==");
break;
case(type_cwnd):
AfxMessageBox("CWnd--operator==");
break;
default:
AfxMessageBox("Default--operator==");
break;
}
return true;
}
006758=64NGNG
>>65
むはー、心強いお言葉!
いえ正直に言うと、できればコーディングスタイルは
変えたくないなぁ…といった所が本音でして…。

ただネット上で、あまりに前者型をみかけないので、ひょっとして全滅
しちゃったのかなと。また就職先がクソ会社かもしれないですしねぇ(´Д⊂

59+65さんのお言葉を胸に、少し模索しつつも当面この
スタイルでいこうと思います。レスありがとうございました。
0068なぜ?NGNG
>>53,56,62,63さん
理解できました。ありがとうございました。
cin >> iで読み込みに成功するとは、cinストリームからデータがiに移ってcinからは
取り除かれる。
cin >> iで読み込みに失敗するとは、cinからデータがiに移らずcinに残ったまま
になる。ということなんですね。読み込みの成功とか失敗の意味が分かってませんでした。
0069_NGNG
仮想関数って遅いって言われてるけど実際どうなんですか?
最近のハードウェアなら問題ないような気がするのですが・・・
0070デフォルトの名無しさんNGNG
>>69
仮想関数が遅いっていうなら、関数のポインタを通してのコールも
遅くなるよ。実際はCALL時のオーバーヘッドが元々大きいので、そんなに
変わらないと思われ。
0071_NGNG
>>70
そうですか。今作ってるソフト全部仮想関数にして実行してみたんですが全然変わらなかったので。。。
1ステップだ3ステップだと言ってる時代はもう終わったのかな。
0072デフォルトの名無しさんNGNG
メモリ参照の分だけペナルティがある。
極限まで最適化する際には足かせになる。
ただ、仮想関数でも呼び出すメソッドが自明な場合は
メモリを介さずに直接callされる
0073デフォルトの名無しさんNGNG
>>71
そうですねえ。STLなんて使ってみたらわかるけど、糞みたいにステップ
数を消費しますよ。あまりステップ数にこだわならない方がいいかも・・・

デストラクタは一回も継承しなくても、仮想関数として定義することを勧めて
いる本もあるぐらいですからねえ。
0074_NGNG
>>72
なるほど、直接呼ばれてたのかも。。。テストプログラム作ってみます。thx
0075_NGNG
>>73
それでもSTL便利すぎですよね><
ちょっとwebで調べたところdynamic_cast仮想関数でも100万回実行して0.23秒?って・・・
コストに拘るスーパーハカー目指すの萎えます・・・
0076_NGNG
class A { bool b; void Func(); };
class B : public A { virtual void Func(); };
void A::Func() { b = false; }
void B::Func() { b = true; }
10000*10000回実行したところvirtual使っても使わなくても両方7か8秒でした。
最近だとステップ数で考えるよりキャッシュにヒットしやすいように書いた方がいいのかな。
0077デフォルトの名無しさんNGNG
クラスの初期化リストで配列を初期化することは出来るのでしょうか?
教えてください。
0078デフォルトの名無しさんNGNG
>>77
できません
0079デフォルトの名無しさんNGNG
わかりました。
それでは、クラスに定数の配列とかを置くことはできないのですか?
0080デフォルトの名無しさんNGNG
static constなら出来ないこともないけど
0081デフォルトの名無しさんNGNG
>>78,80
ありがとうです。
0082デフォルトの名無しさんNGNG
C++builder買おうとおもってるんですが、
ProfessionalとPersonalってそんなに違うんですか?
0083デフォルトの名無しさんNGNG
template<
class T1,
template<class>class CP1
>class RRR{};

このtemplateは何も意味しているんですか?VCしか使ったこと無いから
わかんないよ。
0084デフォルトの名無しさんNGNG
>>83
RRR<int, vector> とかそんな風に書けたりする意味。
0085デフォルトの名無しさんNGNG
>>84
template<typename A,typename B>class AAA{};
と何が違うの??
0086デフォルトの名無しさんNGNG
>>85
マクロと同じ。
マクロ定義の中に先に定義されたマクロがあるだけ。
0087デフォルトの名無しさんNGNG
>>85
それだと AAA<int,vector> でなくて AAA<int, vector<int> > とかになる。
008883NGNG
>>84>>86
サンクス♪
0089デフォルトの名無しさんNGNG
>>86
それはちと違う。その例でいうなら、先に定義したマクロを引数として
取ることができるマクロ、という言い方になる。
あるいは関数ポインタを引数にとる関数、というアナロジーのほうが
適切かと。
0090デフォルトの名無しさんNGNG
● C++とCの(自作)ライブラリを併用した時の質問です。

==== sub.h =================================
void sub(const char *);

==== sub.c =================================
#include <stdio.h>
#include "sub.h"
void sub(const char *s)
{
  printf("%s\n",s);
}

==== main.cc ===============================
#include "sub.h"
int main(int argc, char *argv[])
{
  sub("itteyoshi");
}

==== compile ==============================
g++ -Wall -g -c main.cc
gcc -Wall -g -c sub.c
g++ -Wall -g main.o sub.o -o main
main.cc:4: undefined reference to `sub(char const *)'
collect2: ld returned 1 exit status

Cだったら問題なくリンクできるのに〜? なぜ〜? 名前空間の問題
だと思うんですけど・・・using namespace std;でもダメでした・・・
0091デフォルトの名無しさんNGNG
>>90
ねえ、標準ヘッダのひとつくらい覗いてどう書いてあるか見てみようよ。
009290NGNG
>>91 即レスサンクスコ

……sub.hにexternがないとか??

・Cだとあってもなくてもコンパイル通る
・C++だとあってもなくてもコンパイル通る

んですが……。

もしかして凄く恥ずかしい間違いしているような気がしてきた……
でもわからん……
0093デフォルトの名無しさんNGNG
#ifdef __cplusplus__
extern "C" {
#endif
void sub(const char*);
#ifdef __cplusplus__
}
#endif

たしか、こんな感じ
0094デフォルトの名無しさんNGNG
ワイルドカードのパターンマッチのソースが載っている場所又は
自分でつくれる方教えてください。

入力:パターン文字列(*abc*,?abcなど)、調べる文字列(ababcd)
出力:マッチしたかどうか

似たようなソースでも結構です。お願いします。
0095デフォルトの名無しさんNGNG
GNU RE
0096デフォルトの名無しさんNGNG
>>94
http://pc.2ch.net/test/read.cgi/tech/1021459016/623-668
0097デフォルトの名無しさんNGNG
JavaScriptに値を渡すことってできますか?
0098デフォルトの名無しさんNGNG
C++ からブラウザの JavaScript へ?
無理。Java でも使え。
009997NGNG
>>98
サンクスです。
0100デフォルトの名無しさんNGNG
100
010190NGNG
>>93 Thx。うまくいきました。

ちなみに__cplusplus__ではなく、__cplusplusでした
■ このスレッドは過去ログ倉庫に格納されています