コンパイラが生成する型とAPI

前回 の続き.

C言語のおさらい

繰り返しすぎてそろそろクドいかもしれないが,C言語は,いろいろとフリーダムすぎて扱いづらい.

にも関わらず,UnixというOSの記述言語を超えて広く使われた理由の一つに,ポインタを用いた自由なメモリアクセスがある.

-Wconversion は,いかがでしょう?

ちょいと寄り道して,前回の補足.

鋭い.(汗

はい.-Wconversion ,使えます.記憶が正しければ GCC 2.95.x から. ただ,検出が割と難しいようで,3.4系でパッチが出て,立ち消えになったり. 当時の経緯はこのエントリが詳しいです.

また,GCC 4.3 以降では,挙動が微妙に変わったりしています. 変更内容の詳細は,GCC Wiki を.

GCC は,そんな事情なので,前回の記述

もしかしたら気の利いた処理系では警告を出してくれるかもしれないが.

は,完全に筆が滑っております. お詫びします…が,必ずしも訂正はしません.

今回の後半は,その辺りについて.

C言語における暗黙の型変換とAPI設計

前口上の,つづき.

C言語の整数型に潜む悪夢

まずは,よく知られているところから.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>

int
main(void)
{
  int a = 65535;
  char b;

  b = a;

  printf("%d %d\n", a, b);

  return EXIT_SUCCESS;
}

「a に 65535 を代入し,b に a の値を代入しているのだから,b も 65535 になるはず.」 などとLL言語(JavaScript や Ruby など)に慣れていると思ってしまいがちだが,そうはならない.