紳士のようにCで書く


「フリトスのようなコードモンキー
タブとマウンテンデューのようなコードモンキー
コードモンキー非常に単純な男
大きな暖かいファジーな秘密の心で:
あなたのようなコードモンキー
あなたのようなコードモンキー»

-ジョナサンコールトン-コードモンキー

多くの人がジョナサンコールトンのこのシックな歌に精通しており、「ロブはコードモンキーは非常に勤勉だ」と言うが、「彼の出力は悪臭を放ち」、「彼のコードは「機能的」でも「エレガント」でもない」という状況を知っています。

非常に便利なソフトウェアを提供してくれたC言語は、JavaやC#などの高レベルの巨人によってデスクトップとエンタープライズから徐々に絞り出され、システムプログラミングのニッチを占めました。 そして、すべてがうまくいくだろうが、システムエンジニアは非常に退屈な種類の男です。 言葉遣いがあっても彼らの前で時々起こるタスクは、普通の人間を恐怖に追い込むことができます。 実際、いくつかのソリューションと同じです。

今日は、Cシステムプログラミングの奥深さから学んだいくつかの優れた実践についてお話します。 行こう

項目は、最も基本的で明白な(C言語の初心者向け)から、最も具体的で有用なものまであります。 あなたがそれを知っていると感じたら-スクロールしてください。

実践I:統一されたコードスタイルと「良いトーン」の基本原則を順守する


関数は引数としてINPUT変数を受け取り、それをIncomingValues配列に解析し、result_to_return?を返しますか? バイコードは取っておきましょう!

初心者が最初に与えることは、特定のアプリケーション内でコードを記述する単一のスタイルを守らないことです。 次は「マナー」のルールを無視します。

Cコードを記述するための最も一般的なガイドラインの一部を次に示します。




P.S. : , , , Code Style, . - .

II:


— .
, , , , :

  1. , , .

    file1.c, mySUPER_COOL_header.h ..
    main.c — , graph_const.h — .

  2. include.

    :

    • project/
      • common.c
      • common.h
      • main.c
      • network.h
      • networking.c
      • networking_v6.c
      • packet.c
      • packet.h
      • Makefile

    , . , 9 , , , 39. - . , — , GUI, , , Github/Gitlab/Bitbucket?

    , ? , :

    • project/
      • include/
        • common.h
        • network.h
        • packet.h

      • common.c
      • main.c
      • networking.c
      • networking_v6.c
      • packet.c
      • Makefile

    , include . Makefile (include , Makefile):

    @$(CC) $(OBJS) -o networkd -L$(ROMFS)/lib -linteraction -Wall -lpthread -I ./include

  3. .c .

    , , // — . , — .

  4. , . Makefile :

    .PHONY clean build
    build:
        cd sound/ && make clean && make 
        cd graphics/ && make clean && make
        cd engine/ && make clean && make
    sound:
        cd sound/ && make clean && make
    graphics:
        cd graphics/ && make clean && make
    engine:
        cd engine/ && make clean && make
    clean:
        cd sound/ && make clean
        cd engine/ && make clean
        cd greaphics/ && make clean

III: -


- (-) . , , , errno .

( — ), , «» . -, , , .

— . , (+ ) .

. — :

int sock_one = 0, sock_two = 0, sock_three = 0;
/*     ,   , 
 *     
 */
if ((socket_one = socket(AF_INET , SOCK_STREAM , 0)) <= 0) { 
    perror("socket one");
    exit(EXIT_ERROR_CODE);
}
if ((socket_two = socket(AF_INET , SOCK_DGRAM , 0)) <= 0) { 
    perror("socket two");
    exit(EXIT_ERROR_CODE);
}
if ((socket_three = socket(PF_INET , SOCK_RAW , 0)) <= 0) { 
    perror("socket three");
    exit(EXIT_ERROR_CODE);
} 

, , ? .

/* -  ... */
int Socket(int domain, int type, int proto) {
    int desk = socket(domain, type, proto);
    if (desk <= 0) {
        perror("socket");
        exit(EXIT_ERROR_CODE);
    }
    return desk;
}
/* ......... n   -    ......... */
int socket_one = 0, socket_two = 0, soket_three = 0;
socket_one = Socket(AF_INET , SOCK_STREAM , 0);
socket_two = Socket(AF_INET , SOCK_DGRAM , 0);
socket_three = Socket(PF_INET , SOCK_RAW , 0);

, - ( «» ), .

, . , .

, , , . — :)

IV: keywords


keywords . , , . , — , .

, , . , , . :


. — .

V: . valgrind.


, , , .

Valgrind — , , . , , , , , , . .
+ .

.

VI: ,


busybox 1.21. , busybox, -.

UPD: «» busybox. themiron , , — , . «» busybox, .

, busybox.

busybox , . , — .

busybox. udhcpc — DHCP :





, , , . .

, . , . . .

.

, !

Source: https://habr.com/ru/post/J325678/


All Articles