[C++独自仕様] 1オブジェクト:nアドレス

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ただの屍のようだ

[C++独自仕様] 1オブジェクト:nアドレス

#1

投稿記事 by ただの屍のようだ » 10年前

座学していて、どうしても根拠が知りたくて、熟練のみなさんの力を貸してほしいです。
下記コードの理由・実装仕様についてなんでもコメントしてください。

コード:

namespace _TLC_HEADER_{

class Base{
public:
	virtual void putEnything(){std::cout << "This Class is Base.\n";}
};

class Driver1 : virtual public Base{
public:
	virtual void putEnything(){std::cout << "This Class is Driver1.\n";}
};

class Driver2 : virtual public Base{
public:
	virtual void putEnything(){std::cout << "This Class is Driver2.\n";}
};

class MasterDriver : public Driver1,public Driver2{
public:
	virtual void putEnything(){std::cout << "This Class is M_Driver.\n";}
};


}

コード:

using namespace _TLC_HEADER_;
int _tmain(int argc, _TCHAR* argv[])
{]//同一オブジェクトがたくさんのアドレスを所持しているようです。
//普通のポインタ代入でもたまになりますが、多重継承すれば"確実に"こうなります。
	MasterDriver md;
	Driver1 *pD1 = &md;
	Driver2 *pD2 = &md;
	Base *pB = &md;
	
	printf("0x%08x\n",md);
	printf("0x%08x\n",*pD1);
	printf("0x%08x\n",*pD2);
	printf("0x%08x\n",*pB);
	return 0;
}
*ISLeさんもあいかわらず辛口なんですね、というわけで無学な私にぜひかっこいいところを見せてくださいね

アバター
usao
記事: 1887
登録日時: 11年前

Re: [C++独自仕様] 1オブジェクト:nアドレス

#2

投稿記事 by usao » 10年前

私は規格とかに詳しくないので,その挙動が実装依存なのかなんなのかは知りませんが…

例えば,あなたのコードで「仮称継承じゃない」場合を考えてみたりすると,
何型として見るかによって値が変わるのは自然なことなんじゃないかな?とか思います.
(その場合,MasterDriverは2つのBaseを持たなくてはならないので,
Driver1が継承しているBaseと,Driver2が継承しているBaseとを 別々のものとして区別できないとならないので.)


#正確な情報ではありませんが,なんでもいいというので書きました.返信不要です.

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#3

投稿記事 by ただの屍のようだ » 10年前

どうでもいいことかもしれませんが、英単語のつづり思いっきり間違えてますね。。。
『これはきっと別の世界線の屍さんが悪ふざけで改ざんしたのですね』。と屍1号はドヤ顔で言い訳をしてみます。

>usaoさん
castによって起こるかもしれない事項なので、目の付け所はいいと思いますよ。
しかし、自分のVC++ではMasterDriver mdとDriver1 *pD1は”常に?”同じアドレスをさしています。

ほかのみなさんも思ったこと、文献やサイトで見たこと、憶えていたこと、直感などなど気軽に書いてくださいね。

アバター
usao
記事: 1887
登録日時: 11年前

Re: [C++独自仕様] 1オブジェクト:nアドレス

#4

投稿記事 by usao » 10年前

オフトピック
>しかし、自分のVC++ではMasterDriver mdとDriver1 *pD1は”常に?”同じアドレスをさしています。

ひょっとして
class MasterDriver : public Driver2, public Driver1
として継承の順番を変えて書いたら,それに合わせて変わるって話なんじゃないですかね.

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#5

投稿記事 by ただの屍のようだ » 10年前

しかし、下記のようなコードでも起こります

コード:

//骨組みは前のサンプルと同じ
//*正しいつづりに直しました。。。
	Driver1 D1;
	Base *pB2 = &D1;
	printf("0x%08x\t",D1);	D1.putAnything();
	printf("0x%08x\t",*pB2);	pB2->putAnything();

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: [C++独自仕様] 1オブジェクト:nアドレス

#6

投稿記事 by naohiro19 » 10年前

下線で始まって大文字で始まるものは「予約済み識別子」なので未定義の動作を引き起こす可能性があります。[迷信] 構造体のタグ名は下線で始める | 株式会社きじねこ

例を挙げるなら以下のようなコードです。

コード:

typedef struct _Foo {
    ...
}FOO;

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#7

投稿記事 by ただの屍のようだ » 10年前

未定義だと思うのでしたら、名前空間を削除して検証してください。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: [C++独自仕様] 1オブジェクト:nアドレス

#8

投稿記事 by h2so5 » 10年前

そもそもアドレスを表示するコードが間違っています。

コード:

    printf("0x%p\n", &md);
    printf("0x%p\n", pD1);
    printf("0x%p\n", pD2);
    printf("0x%p\n", pB);
アドレスが違う理由に関しては仮想関数テーブルについて調べてください。

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#9

投稿記事 by ただの屍のようだ » 10年前

なぞが深まりましたね

コード:

//検証コード version 1.1 (笑)
	printf("0x%08x\t0x%08x\t",md,&md);	md.putAnything();
	printf("0x%08x\t0x%08x\t",*pD1,pD1);	pD1->putAnything();
	printf("0x%08x\t0x%08x\t",*pD2,pD2);	pD2->putAnything();
	printf("0x%08x\t0x%08x\t",*pB,pB);		pB->putAnything();
自分のVC++では一列目と二列目が12Bずつズレますね。
そして*pD2 が pD1/&md と同じところをさしてますね。解説お願いします。

*ついでに、仮想関数テーブルの説明のある、Webサイトも

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: [C++独自仕様] 1オブジェクト:nアドレス

#10

投稿記事 by h2so5 » 10年前

仮想関数テーブルくらいは自分で調べてください。何のために座学してるんでしょうか。
https://en.wikipedia.org/wiki/Virtual_method_table
http://www.drdobbs.com/cpp/multiple-inh ... /184402074

hoge

Re: [C++独自仕様] 1オブジェクト:nアドレス

#11

投稿記事 by hoge » 10年前

そもそも、これはなにを表示させているつもりなの?

コード:

    printf("0x%08x\n",md);
    printf("0x%08x\n",*pD1);
    printf("0x%08x\n",*pD2);
    printf("0x%08x\n",*pB);
凄まじく、規格違反なコードなんだが

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#12

投稿記事 by ただの屍のようだ » 10年前

アドレスがずれるのはだいたいわかったつもりです。
さて、ここからの話題はmd/&md,*pD1/pD1の違いになるでしょう。
気になった点でいうと、Base*の*pBとpBだけ指してるところが明らかに違いますね。
(自分のVC++では: *pB == pD2なのだが、pBは明らかに?のようなところをさしていますね)

>hogeさんへ
まず、自分の見解ですが、mdというのはすなわち”オブジェクトの実態”です
よって、printf("0x%08x\n",md);の意味はすなわち:mdの実態の先頭アドレスを表示しなさい
printf("0x%08x\n",&md);の意味もわかります:mdの仮想アドレスを表示しなさい

>h2so5さんへ
さて、これでだいぶ前進しましたね。”仮想テーブルによってそれぞれの型のポインタはそれぞれのレイアウトの先頭を指す。”
ここで問題になるのが printf("0x%08x\n",pB); です。
このアドレスはなにを表示しているのでしょうか?

その他:
>何のために座学してるんでしょうか
(´・ω・`)つ 横たわりながら本を読んだり、暗記>理解のような本は暗記しやすいようノートも取ります
(´・ω・`)つ いんたーねっつ?うぇぶさいと?HAHAHA

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#13

投稿記事 by ただの屍のようだ » 10年前

検証コードでは、自分のサンプルのほうがおかしいのに、正しい検証コードよりもまともな?結果が出ています。
考えた結果:
1クラスの基底部分と派生部分はそもそも離れている。
2新しいオブジェクトができるたびに、仮想テーブルの中のオーバーライドした関数のアドレスだけを上書き
3それぞれのポインタはそれぞれの部分の先頭アドレスを返す。

-----------------------------------------------------------------------------------------------
printf("0x%08x\n",md)について:
表示されるのは、mdクラスのvtableのptrである
printf("0x%08x\n",*pB)について:
理論上同上だが、未定義な動作なので、今の自分ではこれ以上、追求できません

というわけで、一応解決です。それでは座学に戻ります。

アバター
usao
記事: 1887
登録日時: 11年前

Re: [C++独自仕様] 1オブジェクト:nアドレス

#14

投稿記事 by usao » 10年前

オフトピック
何をどう納得されたのかいまいちわからないのですが…
自身が使っているコンパイラの実装詳細に迫りたい みたいな「狭い」話ってことなのでしょうか.

vtableというのは,実装方法の一つであって,
「必ずこういう方法を取らないとならない」という決まり事ではないし,
そういう方法で実現するのだとしても,そのためのテーブル情報をどこらへんに配置するか等も実装次第

…なのでは?

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#15

投稿記事 by ただの屍のようだ » 10年前

自分はsoftyaさんほどひねくれていないので、自分の持つ仮定理論や知識などはだれでもわかるように解説します。
------------------------------------------------------------------------------------------------------------------------------
[誤認]”%xと%p”:自分では普段使わないなので、オブジェクトのアドレスを探して表示するコマンドであると勘違いしている
[正しい認識]→引数の値を16進数に表示するだけのコマンド
-------------------------------------------------------------------------------------------------------------------------------
仮想テーブルについて:(Webサイト見ない人のためのざっくり解説)
1.オーバーライドを実現するためには、継承関係にあるクラス群の情報を持つテーブルが必要→仮想テーブル
2.仮想テーブルへのポインタをオブジェクト内に入れておく必要がある→デフォルトではオブジェクトの先頭に入れられる。
3.特化クラスを作成すると仮想テーブルを複製し、オーバーライドした関数のポインタをオーバーライド元のポインタに置き換える
---------------------------------------------------------------------------------------------------------------------------------
以下が自分の仮説:
考えその1:基底クラスと特化クラスは別々に置かれている。→よってBase*とnew mdの指すところはまったく違う
考えその3:printf("%x",オブジェクト値渡し);によって表示されるのはオブジェクト最初のプライベートメンバーの中身
       →この場合、最初の引数は仮想テーブルへのポインタ(vtableの実装の仕方にかかわらず)

*これはあくまで自分の立てた仮説なので、h2so5さんの考えと違うかもしれないし、h2so5さんの解説を見ればより
すっきりすると思います。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: [C++独自仕様] 1オブジェクト:nアドレス

#16

投稿記事 by YuO » 10年前

結局の所,VC++がクラス,仮想関数や継承をどのようにメモリ上に配置して取り扱っているかが知りたいのでしょうか。
それであるならば,アセンブリコードを出力させて,そのコードを見た方がよいでしょう。
仮説ではなく,事実がわかります。

そうでなく,標準規格でどうなっているのかを知りたいのであれば,ISO規格を買って読んだ方がよいでしょう。
規格中ではオブジェクトのレイアウトについての記述はほぼ存在しませんが。
オフトピック
public・protected・privateの各メンバ変数について,同一セクションにあると固まって配置される,程度の記述はありますが
ただの屍のようだ さんが書きました:>hogeさんへ
まず、自分の見解ですが、mdというのはすなわち”オブジェクトの実態”です
よって、printf("0x%08x\n",md);の意味はすなわち:mdの実態の先頭アドレスを表示しなさい
printf("0x%08x\n",&md);の意味もわかります:mdの仮想アドレスを表示しなさい
ただの屍のようだ さんが書きました:[誤認]”%xと%p”:自分では普段使わないなので、オブジェクトのアドレスを探して表示するコマンドであると勘違いしている
[正しい認識]→引数の値を16進数に表示するだけのコマンド
正しい認識と書いてある物も間違っています。
printfは,書式に基づいて,対応する引数を文字列に変換して標準出力に引き渡す関数です。
ここで,xという指示は「対応するunsigned intの引数を16進数として出力せよ。ただし,9より大きい値には小文字を使え」というものです。
ISO/IEC 9899を読めば載っていることですが,対応する引数が指示に反する型だった場合の振る舞いは未定義であると明確に記述されています。
今回はxに対応する値がポインタ型の値ですから,振る舞いは未定義です。
強制終了しても規格に反しないですし,重要なファイルが一つ消えても,「プログラマにとって予期し得た振る舞い」であるともいえます。

更に言うなら,Windowsの64bit環境において,intは32bit幅ですがvoid *は64bit幅です。
VC++でターゲットをx64としてコンパイルした場合,printfはポインタの下位32bitだけを出力し,上位32bitは出力されません。
それどころか,次の指示があった場合にその上位32bitが使われます。
指示がsだったりすると,文字列のポインタが不正になるので,おかしな文字列が出力されればまだまし,アクセス違反で止まる可能性の方が多いでしょう。
だからこそポインタはvoid *にキャスト後pで出力する (char *で文字列として扱う場合,wchar_t *でワイド文字列として扱う場合を除く) 必要がありますし,
ISO/IEC 9899:1999で<stdint.h>が加えられた時にintptr_tやuintptr_tという型が含まれているのです。

naohiro19 さんが書きました:下線で始まって大文字で始まるものは「予約済み識別子」なので未定義の動作を引き起こす可能性があります。
ただの屍のようだ さんが書きました:未定義だと思うのでしたら、名前空間を削除して検証してください。
「未定義だと思う」のでなく「未定義の振る舞いだと規格に記述されている」のです。
下線から始まり下線が続くか大文字が来る識別子は,実装のために,すべての目的において予約されていますし,
下線から始まる識別子は,大域名前空間において予約されています。
例えば,実装がライブラリの補助関数として利用することもあるでしょうし,マクロとして定義しているかもしれません。
マクロとして定義され,空に展開されるのであれば,コードの意味が大きく変わるでしょう。

このため,naohiro19さんのこの指摘には,もっと真摯に対応すべきことだと思います。

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#17

投稿記事 by ただの屍のようだ » 10年前

ものすごく今更感があるのだが、一つずつ答えますよ

>アセンブリコードを出力させて,そのコードを見た方がよいでしょう。
→前も言いましたが、デバッグスキルとアセンブラは後回しです。
(とくに改良を重ね重ねで複雑なWindowsシリーズを学習するには、膨大な時間と根性がいる)

>IOS規格 → 買う気はありませんね。あんなものを読んでわかったつもりになるだけです。時間をもっと有効に使います

>%xへの認識 → たしかに未定義のようですね。本に書いてないことは基本的に自分の仮説に基づいてコードを書いています。

>naohiro19さんのこの指摘には,もっと真摯に対応すべきことだと思います
→コメントには構造体への誤認というタイトルのサイトがありましたが、自分のサンプルにおいて構造体を使用していません
→話題を広く広げて、分岐を作ったりすると収拾が大変なのでスルーしました。

その他:YuOさんの誤認?について
>下記のサイトによると、予約されているのは、”2 個のアンダースコアまたは大文字に続いてアンダースコアで始まる識別子の名前”
>および”ファイル レベルのスコープ識別子は最初の 2 桁の文字としてアンダースコア () と小文字で指定する必要があります”
http://msdn.microsoft.com/ja-jp/library ... .110).aspx
互いの誤認を解くためにも、”名前変えずに”回答してください。

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#18

投稿記事 by ただの屍のようだ » 10年前

ほかのサイトも見ました。こんなんだからサイトを使って勉強するのがきらいなんですよ。
それぞれの仮説を”あたかも検証済み”のごとく、書いといて何の責任も持ちません。
(*教科書や技術書ではありえません、そんな思うがままあれこれ検証せずに書いた本は売れません)

http://www.wdic.org/w/TECH/%E4%BA%88%E7 ... 5%E5%AD%90
上記サイトによると、”C++ではアンダースコアの入る識別子は全て予約済み”となっています。

アバター
usao
記事: 1887
登録日時: 11年前

Re: [C++独自仕様] 1オブジェクト:nアドレス

#19

投稿記事 by usao » 10年前

>http://www.wdic.org/w/TECH/%E4%BA%88%E7 ... 5%E5%AD%90
>上記サイトによると、”C++ではアンダースコアの入る識別子は全て予約済み”となっています。

そんなことにはなっていないと思いますが.

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#20

投稿記事 by ただの屍のようだ » 10年前

よく見たら、二連アンダースコアのようですね。
自分はこれまでインクルードガードの名前をそのままC++の名前空間にしてしまう癖があったので、
二連アンダースコアとアンダースコア+大文字,大文字+アンダースコアなどは使わないに越したことないでしょう。

*マイクロソフトのページのリンクが違いますね
>ttp://msdn.microsoft.com/ja-jp/library/vstudio/e7f8y25b(v=vs.110).aspx

アバター
usao
記事: 1887
登録日時: 11年前

Re: [C++独自仕様] 1オブジェクト:nアドレス

#21

投稿記事 by usao » 10年前

毎度のことながら(?)
MSDNは日本語側のページだと何言ってるかわからないので,英語版の方が行ってる言ってることが把握しやすいかと思います.
http://msdn.microsoft.com/en-us/library ... 10%29.aspx

引用:
Microsoft Specific

Do not select names for identifiers that begin with two underscores or with an underscore followed by an uppercase letter. The ANSI C standard allows identifier names that begin with these character combinations to be reserved for compiler use. Identifiers with file-level scope should also not be named with an underscore and a lowercase letter as the first two letters. Identifier names that begin with these characters are also reserved. By convention, Microsoft uses an underscore and an uppercase letter to begin macro names and double underscores for Microsoft-specific keyword names. To avoid any naming conflicts, always select identifier names that do not begin with one or two underscores, or names that begin with an underscore followed by an uppercase letter.

END Microsoft Specific
最後に編集したユーザー usao on 2014年5月22日(木) 18:09 [ 編集 1 回目 ]

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#22

投稿記事 by ただの屍のようだ » 10年前

>Do not select names for identifiers that begin with two underscores or with an underscore followed by an uppercase letter.
たしかに2連アンダースコアとアンダースコア+大文字は名前に使うべきではないと書いてありますね。
さて、今度こそ座学に戻りますか。

アバター
usao
記事: 1887
登録日時: 11年前

Re: [C++独自仕様] 1オブジェクト:nアドレス

#23

投稿記事 by usao » 10年前

オフトピック
識別子名として
・2連アンダースコア
・アンダースコア+大文字
で始まるやつは使うんじゃねぇぜ.
そいつらはANSI C標準で,コンパイラが使うために予約してっから.
あー,あと
・アンダースコア+小文字 で始まるファイルスコープな識別子名
っていうのも付けちゃダメね.それも同じように予約してるから.

慣例的にMicrosoftは
アンダースコア+大文字 で始まるやつをマクロ名に.
2連アンダースコア で始まるやつをMicrosoft固有のキーワード名に使ってるけどね.
(ここが,"Microsoft固有の仕様" かな?)

あれだ,名前の衝突を避けるには 常に
アンダースコア,2連アンダースコア,アンダースコア+大文字 (なんかこれだと冗長な物言いような?)
で始まるような名前は使わないこった.うん.
[hr]
って感じですかね.
で,これはCの話で,
C++だとさらに 2連アンダースコアが先頭に限らず含まれてるやつ もダメですよ,と.

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: [C++独自仕様] 1オブジェクト:nアドレス

#24

投稿記事 by Dixq (管理人) » 10年前

まずただの屍のようださんの態度が質問者としてふさわしくありません。
自分の為に時間を割いて対応してくれている人に対して

> 自分はsoftyaさんほどひねくれていないので、自分の持つ仮定理論や知識などはだれでもわかるように解説します。

とはどういう事でしょうか。
ただの屍のようださんについてはいつも管理人間で問題になっています。

これ以上回答者が回答したくなくなるような言動はしない方が結局自分の為になりますよ。
それが何だか分かって無いのかもしれませんが・・・。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: [C++独自仕様] 1オブジェクト:nアドレス

#25

投稿記事 by YuO » 10年前

私の書いたコメントに対しての返信のあと,話が進んでいますが,それはさておいてhttp://dixq.net/forum/viewtopic.php?f=3&t=15121#p120564に対しての返信をすべて書いてしまいます。
結果として,その後のコメントと重複する部分もあります。
ただの屍のようだ さんが書きました:>アセンブリコードを出力させて,そのコードを見た方がよいでしょう。
→前も言いましたが、デバッグスキルとアセンブラは後回しです。
オフトピック
前にも言ったというのは,このスレッド中のどの記述でしょうか。
他のスレッドであなたが宣言したことなんて,書いていないのと同じです。
アセンブリを見るとかしないのであれば,メモリ上でどう展開されるかなんて気にするだけ無駄です。
C++を使う上で,メモリ上でどう展開されるかなんて知る必要が無いですから (規格上,決められていない)。
ポインタ値がメモリのアドレスだとかすらも実装依存事項で,そんなことは知らずともC++でプログラムを書くことができます。
ただの屍のようだ さんが書きました:>naohiro19さんのこの指摘には,もっと真摯に対応すべきことだと思います
→コメントには構造体への誤認というタイトルのサイトがありましたが、自分のサンプルにおいて構造体を使用していません
→話題を広く広げて、分岐を作ったりすると収拾が大変なのでスルーしました。
リンク先をちゃんと読みましたか。
構造体に限らず,識別子一般で使えない,ということがちゃんと書いてあります。
少なくとも,
ただの屍のようだ さんが書きました:未定義だと思うのでしたら、名前空間を削除して検証してください。
は,問題を理解していないようにしか読めませんでした。
「未定義だと思う」という表現は,規格書に「未定義である」と書いてある,つまりはC++として「未定義である」ことを知っている場合に使う表現ではないですから。
オフトピック
「だと思う」は「それが事実かどうかわからないがそう考える」ということなので
ただの屍のようだ さんが書きました:その他:YuOさんの誤認?について
>下記のサイトによると、予約されているのは、”2 個のアンダースコアまたは大文字に続いてアンダースコアで始まる識別子の名前”
>および”ファイル レベルのスコープ識別子は最初の 2 桁の文字としてアンダースコア () と小文字で指定する必要があります”
http://msdn.microsoft.com/ja-jp/library ... .110).aspx
誤認とはどの項目について,どのように誤認したと考えているのでしょうか。
書かれているURIと,その前の引用文らしきもの (歴史的経緯(NewsgroupやMailでの利用)から,掲示板においても>から始まる行は引用文であることが多い) を見る限り,予約済み識別子の範囲についてでしょうか。

書かれているURIからvstudio/を抜いてhttp://msdn.microsoft.com/ja-jp/library ... .110).aspxを指定すれば,このページが機械翻訳であることがわかります。
おそらく,引用文らしきものの中で明確に引用している部分 (”で始まり”で終わる部分) は,同サイトの
Microsoft 固有の仕様 →

2 個のアンダースコアまたは大文字に続いてアンダースコアで始まる識別子の名前を選択します。 ANSI C 規格ではコンパイラ用に予約されています。これらの文字で始まる識別子名を使用できます。 ファイル レベルのスコープ識別子は最初の 2 桁の文字としてアンダースコア () と小文字で指定する必要があります。 これらの文字で始まる識別子名では予約されています。 通常Microsoft ではアンダースコアおよび Microsoft 固有のキーワードの名前のマクロ名と二つのアンダースコアを開始するには大文字を使用します。 名前の競合を回避するには二つのアンダースコアで始まらない常にアンダースコアで始まる識別子名または大文字にしています。

終了 Microsoft 固有の仕様→
の一部だと思いますが,ここに対応する英文は,http://msdn.microsoft.com/en-us/library ... .110).aspx
Microsoft Specific

Do not select names for identifiers that begin with two underscores or with an underscore followed by an uppercase letter. The ANSI C standard allows identifier names that begin with these character combinations to be reserved for compiler use. Identifiers with file-level scope should also not be named with an underscore and a lowercase letter as the first two letters. Identifier names that begin with these characters are also reserved. By convention, Microsoft uses an underscore and an uppercase letter to begin macro names and double underscores for Microsoft-specific keyword names. To avoid any naming conflicts, always select identifier names that do not begin with one or two underscores, or names that begin with an underscore followed by an uppercase letter.

END Microsoft Specific
です。日本語側は,「not」が訳から抜けているために意味が大きく変わる誤訳であり,さらに英文レベルでも規格と齟齬があります。
以下,標準規格より引用します。
ISO/IEC 9899:1999 7.1.3 Reserved identifiers
  • All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
  • All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.
ISO/IEC 14882:2011 17.6.4.3.2 Global names
  • Each name that contains a double underscore _ _ or begins with an underscore followed by an uppercase letter (2.12) is reserved to the implementation for any use.
  • Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.
JIS X 3010:1993 7.1.3 予約済み識別子
  • 下線に続き英大文字1 字又は下線に続きもう一つの下線で始まるすべての識別子は,いかなる使用に対しても常に予約済みとする。
  • 一つの下線で始まるすべての識別子は,通常の識別子及びタグ名前空間の双方におけるファイル有効範囲をもつ識別子としての使用に対して,常に予約済みとする。
規格の文は上記の通りです。
ですから,MS-Specificについての説明文中の
Identifiers with file-level scope should also not be named with an underscore and a lowercase letter as the first two letters.
は,
Identifiers with file-level scope should also not be named with an underscore as the first one letter.
あたりが本来の規格に沿った文です。

この項で私の誤認と書くならば,同時にISO/IEC 14882の上記の段落を引用した上で,C++においては「__から始まる」だけではなく「__を含む」識別子全てが予約済み識別子である,ということの指摘を書くくらいは必要です。
「何が誤認か」をわかるように記述し,その根拠となる資料を提示するのは「誤認」と書いた側の責務です。
もちろん,先に私が引用した文中で書いた,ただの屍のようださんが書かれている「誤認」が上記を意味しているかどうか,私は知り得ませんが。
ただの屍のようだ さんが書きました:互いの誤認を解くためにも、”名前変えずに”回答してください。
少なくとも1998年頃から,プログラム系掲示板では3文字のアカウントがとれないような場合を除き常にこの名前を使っています。
「”名前変えずに”」と二重引用符で強調しているのは,私が名前を変えたと疑っているのでしょうか。
そうであるならば,どのコメントが,私が名前を変えて書いた物だと疑ったのでしょうか。
オフトピック
私だけで無く,疑ったコメントを投稿された方にも失礼な話だと思いますが。
あと,「互いの誤認」とやらが何かも説明して下さいね。
何が誤認か書かれておらず,当然その根拠も示されていませんから。

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#26

投稿記事 by ただの屍のようだ » 10年前

あいかわらず、ものすごく今更感のある反論ですね。
ほとんど話が進んで結論が出てる以上。無意味な噛み付きはただのいやがらせにしか受け取れませんね。
なにでそんなに腹立っているかはさておき、一応”誤認”に”?マーク”も付いてるし。しかも解決済みです。

>Dixqさんへ
「今の理系大学で平均以上の学力を持つ生徒たちとアインシュタインやニュートンとどっちが賢いのだろう?」
「私の答えは、生徒たちです。」「かつての偉人たちの足跡をたどることで、数年にして肩を並べ、さらに数年であっさり超えてしまう」
そう、技術も学問も積み重ねです。掲示板やコミュニティも言ってしまえば、情報収集のための”公用スペース”でしかありません。
あっさり答えてしまえばいいものを、もったいぶって長々と問い続けて、それではよっぽどメンタルタフでない人はなにも学べずにさってしまいます。
初心者こそが未来の先駆者なのに!!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: [C++独自仕様] 1オブジェクト:nアドレス

#27

投稿記事 by softya(ソフト屋) » 10年前

ただの屍のようださんの主張は全て主観に基づいた俺理論です。
それと他の人の齟齬が生じているのでDixqさんが書き込みされたわけです。
俺理論だけを主張すれば、社会的には周囲から乖離していきます。 これは掲示板であろうと現実世界であろうと同じです。

とりあえずYouYuOさんの件は素直に謝れない大人げない人であり、指摘されたら「いやがらせ」だと俺理論です。 [名前を間違えましたので修正します。申し訳ありません]
回答してくれる人を減らしたいとしか思えませんし、このままでは掲示板の荒らしとみなさんに見なされます。
と言うことで、俺理論を曲げない謝れない方に今後も私は質問の回答はいたしませんが、管理人として一言言わせていただきました。
【補足】私に対するストーキング行為はやめてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#28

投稿記事 by ただの屍のようだ » 10年前

Youさんとは直接やり取りして、問題を解決していませんが。
指摘はちゃんと受け取り、正しい結論にたどり着いたつもりです。

素直に謝れないという対象も、若干ずれています。最初に識別子を話題に出したnaohiroさんです。
→サイトのタイトルだけ見て、早とちりした返事、申し訳ありません。

自分としては別に”あらし”と思われてもかまいません。
そもそも自分の歩み道は最初から”一人幅”としか想定していませんし。
就職するにしても、ブラックや派遣をターゲットにするから、実際に会うこともありません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: [C++独自仕様] 1オブジェクト:nアドレス

#29

投稿記事 by softya(ソフト屋) » 10年前

ただの屍のようだ さんが書きました: 素直に謝れないという対象も、若干ずれています。最初に識別子を話題に出したnaohiroさんです。
→サイトのタイトルだけ見て、早とちりした返事、申し訳ありません。
やはり分かられていない様なので書いておきます。
YouYuOさん、naohiroさんに対して自作自演を匂わせる発言をしましたよね? [名前を間違えましたので修正します。申し訳ありません]
掲示板において自作自演は恥ずべき行為ですので、これは大げさに例えれば「おまえが泥棒だ!」と叫んだと同じことなんです。
その事について謝るべきだという話です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ただの屍のようだ

Re: [C++独自仕様] 1オブジェクト:nアドレス

#30

投稿記事 by ただの屍のようだ » 10年前

>Youさん、naohiroさんに対して自作自演を匂わせる発言をしましたよね?
Youさんは管理人の一人と推測しましたが、naohiroさんの自演と思ったことはありません。
匂わせたというより、被害妄想のほうが近いのではないだろうか?

あと、そろそろ余計な論争を終わらせて、座学に専念したいと思います。
(一応問題を一つ解決してもらったからには、このトピックで自分向けのコメントには全て返事するつもりです。)

閉鎖

“C言語何でも質問掲示板” へ戻る