移植性

非標準処理系と移植性

C/C++の移植性を考える場合、一般論としては、非標準処理系や処理系の不具合は対象にすべきではありません。そうした話を持ち出すと、結局のところ標準規格は一切機能しなくなり、何が起きても不思議ではない状況が発生してしまいます。

ただ、現実的には、主要な処理系、あるいは大多数の処理系が規格にしたがっていないような場合もあります。例えば、C++のexportとか、国際文字名とかがそれにあたります。そうした場合には、「規格がこうだから」という話をいくらしても、現実には役に立ちません。つまり、こうした場合には、いわゆる一般論は通用しなくなるわけです。

もうひとつ、必ずしも主要とはいえないけれども、今自分が相手をしている処理系、あるいは今後相手をすると予想される処理系が、規格とは異なる振る舞いをする場合には、当然それらに対する配慮を行わなければ、必要な移植性を持たせることができなくなります。

外部識別子の有意先頭文字数の制限に関して

先日行われたTOPPERSプロジェクトのコンポーネント仕様WGの合宿で話題になったので、少しだけ書き留めておきます。

Cの外部識別子の有意先頭文字数についてなのですが、C90では(規格上は)6文字以内でしかも大文字小文字の区別なしということになっています。C99では、それが31文字まで拡張されています。ただし、C99に対応していない処理系の場合も、現在使われているものについていえば、有意先頭文字数31文字で大文字小文字の区別ありと考えて問題ないだろうと思っていました。

ところが、現実はそう甘くはありませんでした。新世代カーネルのコンフィギュレータが生成する中間ファイル(cfg1_out.c)では、比較的長めの外部識別子を使っているのですが、それが途中でちょん切れるケースが出てきたのです。調べてみると、外部識別子の有意先頭文字数は15文字(先頭に付加されるのアンダスコア等を含めて16文字)のようでした。

はっきり名前を出すと、M16C用のリンカLN30です。さらに調査してもらったところ、どうやらリンカオプションによるようで、今回に関しては比較的あっさり問題を解決できたわけですが、今後移植性を考慮する際には、外部識別子15文字も考慮に入れなければならないようです。

C++における構造体の初期化

「[迷信] とりあえず memset で初期化」へのアクセスは相変わらず多いのですが、解説があっさりしているために十分意図が伝わっていないことも少なくないようです。これまでも何度か補足的な解説を行ってきたのですが、今回もその一環として、補足解説を行うことにします。

一般的な話をすると、どうしても解説が抽象的になってしまい、その結果またしても十分に意図が伝わらないということが起きそうです。そこで、今回は解説の対象を絞り込み、できるだけ具体的な話をするつもりです。今回対象とするのは「C++の構造体の初期化」です。Cの話ではありません。また、「初期化」と書いていますが、いわゆる初期化子による初期化だけでなく、最初に値を設定する意味上の初期化も対象とします。

[迷信] 2の累乗による割り算と右シフトは等価

多くの場合、実際に試してみればすぐに分かることですが,2n による割り算と右シフトは、常に等価になるとは限りません。しかし、この問題は規格上処理系定義の要素が複雑に絡み合っているため、注意深く考えないと全体像をとらえることができません。

『組込み現場の「C++」プログラミング 明日から使える徹底入門』サポートページ

このページでは、『組込み現場の「C++」プログラミング 明日から使える徹底入門』に関するサポート情報を掲載しています。

第6回 整数型の内部表現

C言語に限らず、コンピュータでは数値の表現には「2 進法」が使われます。コンピュータが扱う数の最小単位は、0 と 1 の 2 つの値だけを格納できる「ビット」だからです。0 と 1 だけを用いた数の表記方法を 2 進表記といい、2 進表記で表された数のことを「2 進数」といいます。こういう書き方をすると非常に難しく感じるかもしれませんが、何のことはない、中学生レベルの数学の概念に過ぎません。

第5回 int 型のサイズ

C言語の整数型は処理系によってサイズが異なります。標準規格では、それぞれの整数型が少なくともどれだけの表現範囲を持っているか、そして、それぞれの整数型の間の表現範囲の大小関係だけが決められています。

整数型の中でも、int 型のサイズは 16 ビットと 32 ビットの処理系がそれなりに多く存在することもあり、入門書や解説書でも注意が促されることが多いようです。最近では long 型が 64 ビットの処理系もありますので、整数型のサイズを取り巻く状況はもう少し複雑になってきています。

そうした中、極力ソースコードの移植性を高めようということで、int 型のようにサイズがよくわからない型は使用せず、int16 型とか、int32 型のような型を定義して、「それらを使うべし」とするコーディング規約もよく見かけます。それで本当に、int 型のサイズに関する移植性の問題は解消されたのでしょうか?

第1回 C言語とは

この記事のタイトルを目にしたとき、一通りC言語でプログラミングができる方を対象としているはずなのに、「いまさら『C言語とは』といった記事にどんな意味があるのか?」と思われたのではないでしょうか?退屈な話はパスして、さっさと次のページに進みたいかもしれませんが、そこをグッとこらえて、少しだけお付き合いください。

「C」という言語名の意味

C言語を一通り習得された方であれば、「C」というのが「Bの次」の意味であることはどこかで見聞きしたことがあるのではないでしょうか。確かに、C言語の系譜を見ていくと、C言語の前に「B言語」というのが見つかります。では、B言語の前に「A言語」というのがあったのでしょうか?

人によっては、A言語に相当するのはアセンブリ言語だと主張されるかもしれませんね。それでは、C言語の次は「D言語」なのでしょうか?確かにD言語というのも実在します。そして、D言語はC言語の次を狙っているようにも見えます。

コンテンツ配信