スレッド: [cppll:8643] designated initializer

スレッド

[cppll:8643] designated initializer

[ | ▲ / | ]
Subject:
[cppll:8643] designated initializer
From:
Shin'ya MORINO <smorino@...>
Date:
Wed, 07 May 2003 19:36:44 +0900
Message-Id:
<3eb8de96.101%smorino‐at‐datamark.co.jp>
森野です。

Linuxのドライバを開発している人から、教えてもらった話。
gccでは、構造体の初期化に変数名をラベルとして使えるそうです。
http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_4.html#SEC81

C99にも、designated initializerとして、定義されています。

たとえば、以下のコード、gcc/g++-3.2.2の両者でオッケー。
----------------------------------------------------------
struct foo {
 int a;
 int b;
 int c;
};

int main() {
 struct foo f = {
   a: 0,
   b: 1,
   c: 2
 };
}
----------------------------------------------------------

ちょっと、ひねって、メンバを省略してみます。
----------------------------------------------------------
struct foo { 上のリストに同じ};

int main() {
 struct foo f = {
   c: 2
   a: 0,
 };
}
----------------------------------------------------------
gccでは、OK。g++では、

$ g++ foo.cpp -o foo
foo.cpp:10: 残念ながら見実装です: 自明でないラベルのついた初期化子です。

だそうです。
蛇足ですが、見実装っての、typoじゃありません。
だけど、そこんとこ、なんともいえず、かわゆく思えてしまいます。

-------
森野慎也  mailto:smorino@...

[cppll:8644] Re: designated initializer

[ | / | ]
Subject:
[cppll:8644] Re: designated initializer
From:
Shin'ya MORINO <smorino@...>
Date:
Wed, 07 May 2003 20:37:10 +0900
Message-Id:
<3eb8ef73.104%smorino‐at‐datamark.co.jp>
In-Reply-To:
8643
References:
8643
森野です。

Shin'ya MORINOさんの<3eb8de96.101%smorino@datamark.co.jp>から
>Linuxのドライバを開発している人から、教えてもらった話。
教えてもらった人から、訂正。

>C99にも、designated initializerとして、定義されています。
C99では、以下のように書くんだそうで。
# 未確認。識者の意見請う。

----------------------------------------------------------
struct foo {
 int a;
 int b;
 int c;
};

int main() {
 struct foo f = {
   .a=0,
   .b = 1,
   .c = 2
 };
}
----------------------------------------------------------
-------
森野慎也  mailto:smorino@...

[cppll:8645] Re: designated initializer

[ | / | ]
Subject:
[cppll:8645] Re: designated initializer
From:
Takao Ono <takao@...>
Date:
Wed, 7 May 2003 20:43:21 +0900
X-Mailer:
mnews [version 1.22PL5] 2001-02/07(Wed)
Message-Id:
<030507204321.M0100434‐at‐flame.hirata.nuee.nagoya-u.ac.jp>
In-Reply-To:
8644
小野@名古屋大学 です.

<3eb8ef73.104%smorino@datamark.co.jp>の記事において
smorino@...さんは書きました。
smorino> >C99にも、designated initializerとして、定義されています。
smorino> C99では、以下のように書くんだそうで。
です.
smorino> # 未確認。識者の意見請う。
# 識者じゃないですが.

あと, 配列で特定の要素だけ値を指定したいときには
int a[5] = {
   [0] = 1, [3] = 4
};
なんて書き方もできますね.
--
名古屋大学大学院 情報科学研究科 計算機数理科学専攻
小野 孝男

[cppll:8648] Re: designated initializer

[ | / | ]
Subject:
[cppll:8648] Re: designated initializer
From:
Shin'ya MORINO <smorino@...>
Date:
Thu, 08 May 2003 09:46:36 +0900
Message-Id:
<3eb9a8be.108%smorino‐at‐datamark.co.jp>
In-Reply-To:
8645
References:
8644 8645
森野です。

Takao Onoさんの<030507204321.M0100434@flame.hirata.nuee.nagoya-u.ac.jp>から
>小野@名古屋大学 です.
ちーっす。

>あと, 配列で特定の要素だけ値を指定したいときには
>int a[5] = {
>    [0] = 1, [3] = 4
>};
>なんて書き方もできますね.

このときに、すっとばされた要素の値は、どーなるんだろ.....と思ってました。
gcc的には、0に初期化してくれるみたいっす。

-------
森野慎也  mailto:smorino@...

[cppll:8649] Re: designated initializer

[ | / | ]
Subject:
[cppll:8649] Re: designated initializer
From:
Osamu Shigematsu <m5issige@...>
Date:
Thu, 08 May 2003 09:50:46 +0900
X-Mailer:
Becky! ver. 2.05.11
Message-Id:
<20030508094946.975C.M5ISSIGE‐at‐mr.hitachi-medical.co.jp>
In-Reply-To:
8645
References:
8644 8645
重松です。こんにちは。
私も識者ではありませんが、

http://seclan.dll.jp/c99d/c99d07.htm#dt19991025
は、いつも参考にしています。

--
Osamu Shigematsu <m5issige@...>

[cppll:8650] Re: designated initializer

[ | / | ]
Subject:
[cppll:8650] Re: designated initializer
From:
Satoshi Nakamura <watson@...>
Date:
Wed, 07 May 2003 17:56:50 -0700
X-Mailer:
QMAIL 2.9.0 / Windows 2000 Service Pack 3 / x86
Message-Id:
<202420030507175225watson‐at‐zak.att.ne.jp>
In-Reply-To:
8644
References:
8643 8644
中村です。

At 07 May 2003 20:37:10 +0900 Shin'ya MORINO wrote:
> >C99にも、designated initializerとして、定義されています。
> C99では、以下のように書くんだそうで。

designated initializerとcompound literalを使って名前付き引数もどき。

typedef struct {
int x;
int y;
} arg;

void foo(const arg* p) {
// ...
}

void bar() {
foo(&(arg){ .x = 100 });
}

なんていうのを一瞬考えてみたりしましたが、面倒になっているだけのような気も
しますね^^;;


以前にも出たことがあると思いますが、一応ご紹介。
プログラミング言語 C の新機能
<http://seclan.dll.jp/c99d/>


--
Satoshi Nakamura <snak@...>

[cppll:8652] Re: designated initializer

[ | / | ]
Subject:
[cppll:8652] Re: designated initializer
From:
DENCHU <cppll@...>
Date:
Thu, 08 May 2003 10:00:17 +0900
X-Mailer:
Datula version 1.52.01 for Windows
Message-Id:
<E19DZli-0005kI-00‐at‐deedlian.denchu.jp>
In-Reply-To:
8643
References:
8643
Shin'ya MORINOさんの<3eb8de96.101%smorino@datamark.co.jp>から
>Linuxのドライバを開発している人から、教えてもらった話。
>gccでは、構造体の初期化に変数名をラベルとして使えるそうです。
>http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_4.html#SEC81

 面白そうですね。
 個人的には noreturn がいいなぁ。と思ってみたり(^^;

 ところで、

>int main() {
>  struct foo f = {
>    a: 0,
>    b: 1,
>    c: 2
>  };
>}

 こっちと

>int main() {
>  struct foo f = {
>    c: 2
>    a: 0,
>  };
>}

 こっちの違いがちょっと分かりません(^^;
 (c: 2 は c: 2, の typo だとして)

 ところで、gcc にはいろいろな拡張がしてあってちょっとあこがれま
すね。(case の範囲指定とか)
 まぁ、Microsoft が似たようなことをやったら、それはそれで批判の
対象なんでしょうけど、ちょっとうらやましかったり。

--
電柱一家
mailto:cppll@...
http://denchu.jp/

[cppll:8653] Re: designated initializer

[ | / | ]
Subject:
[cppll:8653] Re: designated initializer
From:
Shin'ya MORINO <smorino@...>
Date:
Thu, 08 May 2003 10:17:25 +0900
Message-Id:
<3eb9aecd.111%smorino‐at‐datamark.co.jp>
In-Reply-To:
8652
References:
8643 8652
森野です。

DENCHUさんの<E19DZli-0005kI-00@deedlian.denchu.jp>から
> 個人的には noreturn がいいなぁ。と思ってみたり(^^;
ありますねー。(^^

>>int main() {
>>  struct foo f = {
>>    c: 2
>>    a: 0,
>>  };
>>}
>
> こっちの違いがちょっと分かりません(^^;
> (c: 2 は c: 2, の typo だとして)
ありゃ、すっ飛ばして書いちゃいました。堪忍。(^^;;

たとえば、ラベルの順序を入れ替えたり
----------------------------
struct foo f = {
 c: 2,
 b: 1,
 a: 0
};
----------------------------

途中のラベル抜いたり
----------------------------
struct foo f = {
 a: 0,
 c: 2
};
----------------------------

すると、コンパイルしてくれません。
# Cのソースだと、でけるんですが。


-------
森野慎也  mailto:smorino@...

[cppll:8656] Re: designated initializer

[ | / ▼ | ]
Subject:
[cppll:8656] Re: designated initializer
From:
DENCHU <cppll@...>
Date:
Thu, 08 May 2003 10:45:53 +0900
X-Mailer:
Datula version 1.52.01 for Windows
Message-Id:
<E19DaTq-0005lr-00‐at‐deedlian.denchu.jp>
In-Reply-To:
8653
References:
8643 8652 8653
Shin'ya MORINOさんの<3eb9aecd.111%smorino@datamark.co.jp>から
>たとえば、ラベルの順序を入れ替えたり

>途中のラベル抜いたり

 ほうほう、なるほど。
 途中のラベルを抜いたり出来ないのはちと不便ですね。
 C99 だといろいろと拡張されて便利そうなんですよね。

#使おうかなぁ(なにに?)

 そういえば、VisualStudio .NET の新しいのが出たんでしたっけ。
 会社のマシンにインストールしてみようかな。(暇無いけど)

--
電柱一家
mailto:cppll@...
http://denchu.jp/

Navigation

検索

[検索ヘルプ]

Maintener: Tietew <www.tietew.jp>
Powered by Ruby on Rails, Mongrel, PostgreSQL, and Hyper Estraier.
click here