As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

POSIX1日1コマンド[part11]: c99

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

c99

c99

とりあえず使ってみる

[vagrant@localhost 011]$ c99
-bash: c99: command not found

コマンドが見つかりません。

yumでインストールしてみよう

[vagrant@localhost 011]$ sudo yum install c99
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
base                                                                                                                                                          | 3.6 kB  00:00:00
extras                                                                                                                                                        | 3.4 kB  00:00:00
updates                                                                                                                                                       | 3.4 kB  00:00:00
(1/4): base/7/x86_64/group_gz                                                                                                                                 | 166 kB  00:00:00
(2/4): extras/7/x86_64/primary_db                                                                                                                             | 187 kB  00:00:00
(3/4): updates/7/x86_64/primary_db                                                                                                                            | 5.2 MB  00:00:01
(4/4): base/7/x86_64/primary_db                                                                                                                               | 5.9 MB  00:00:02
No package c99 available.
Error: Nothing to do

というわけでc99を使えるようにするところから書きます。

c99を使えるようにする

そもc99とは

C99 - Wikipedia

C99は、ISOで定められたC言語の規格である。正式な規格名は ISO/IEC 9899:1999。 ANSIの標準化プロセス(C89)のあと、C言語仕様はC++が標準化の取り組みによって進化しているのと比べて停滞していた。1995年には標準追補を作成したが、これはC89への細かい修正および国際文字集合対応の追加であった。1990年代の後半にいくつかの訂正を経て、ISO/IEC 9899:1999 として1999年に発行した。この標準は"C99"と呼ばれ、ANSI標準としても2000年5月に受理。国際的なC標準は作業部会ISO/IEC JTC1/SC22/WG14で保守している。

C言語の規格のようですね。

インストールする

gccに含まれているようです。
ですのでgccをpackage managerでインストールします。

$ sudo yum install gcc
$ sudo apt install gcc
$ c99
gcc: fatal error: no input files
compilation terminated.

c99コマンドが実行できるようになりました。

c99を使う

ざっくり使い方

C言語はわからないのでインターネットでしらべたHello Worldを準備します。

$ vim hello.c
#include <stdio.h>

int main(int argc, char *args[])
{
    printf("Hello, world!\n");
    return 0;
}

コンパイル

$ c99 hello.c
$ ./a.out
Hello, world!

アウトプットファイルの名前を指定

$ c99 -o hello hello.c
$ ls
a.out  hello  hello.c
$ ./hello
Hello, world!

ざっくりDESCRIPTION (翻訳)

Cプログラムをコンパイルする。
c99ユーティリティは、標準Cコンパイルシステムへのインタフェースである。 ISO C標準に準拠したソースコードを受け入れなければならない。システム概念的には、「コンパイラ」と「リンクエディタ」で構成されている。
[pathname] オペランドと[-l option-arguments] で参照される入力ファイルはコンパイルとリンクが行われ、実行可能ファイルが生成されます。 (リンクが完全にc99のオペレーション内で完全に起こるかは不特定です。一部の実装では、ファイルが実行されるまで完全には解決されないオブジェクトが生成されることがあります。)
[-c] オプションを指定すると、.cのフォームファイルのすべての [pathname] オペランドに対して、ファイルは次のようになります。

$(basename pathname .c).o

コンパイルが成功した結果として作成されるものとします。-cオプションが指定されていない場合、.cファイルオペランドに対してこのような.oファイルが作成されるか削除されるかは不定です。
リンクの編集を妨げるオプション(-cや-Eなど)がなく、すべての入力ファイルがエラーなしでコンパイルおよびリンクされた場合、結果の実行可能ファイルは [-o outfile] オプション(存在する場合)またはファイル [a.out] に書き込まれます。
実行可能ファイルは、ファイルの読み取り、書き込み、および作成で指定されているとおりに作成されますが、ファイルのパーミッションビットは次のように設定されます:S_IRWXO | S_IRWXG | S_IRWXU

プロセスの umask で指定されたビットはクリアされます。

ざっくりOPTION

C言語の知識がないのでオプションをざっくりキーワードだけ載せます。

  • -c
    • C言語の#defineディレクティブのように名前を定義します。
  • -D name[=value]
  • -E
    • C言語のソースファイルを標準出力にコピーし、すべてのプリプロセッサディレクティブを実行します。編集は行われません
  • -g
    • オブジェクトまたは実行可能ファイルに記号情報を生成する。
  • -I directory
  • -L directory
  • -l library
    • liblibrary.aという名前のライブラリを検索します。
  • -O optlevel
    • コード最適化のレベルを指定します。
  • -o outfile
    • 生成された実行可能ファイルには、デフォルトのa.outの代わりにパス名のoutfileを使用します。
  • -s
    • POSIX.1-2017のSystem Interfacesボリュームで定義されているexecファミリを使用して適切な実行に必要ないシンボリックおよび他の情報が削除(削除)されたオブジェクトまたは実行可能ファイル、またはその両方を生成する。
  • -U name
    • 名前の初期定義を削除します。

ざっくりまとめ

コンパイラの知識がない人からしたらc99は流石にコマンド名からどういう動作をするのか分からないのではないでしょうか。
私はC言語を使ったことがない + コンパイルとかをよく知らないのでこの程度のことしかかけませんでした。

gccGNUコンパイラコレクションですね。c99はc言語の規格なので様々な規格のコンパイラgccには入っているのでしょうね。