Promo

 

adalah dokumen yang menggambarkan pendek pilihan gaya untuk coding linux kernel. Coding gaya sangat pribadi, dan saya tidak akan _force_ Kontak dilihat pada siapa saja, tapi ini adalah apa yang berlaku untuk sesuatu yang saya harus bisa menjaga, dan saya lebih banyak untuk hal-hal lain yang juga. Harap setidaknya mempertimbangkan poin yang dibuat di sini.

Pertama, saya sarankan pencetakan keluar salinan GNU coding standar, dan tidak membacanya. Membakar mereka, It'sa great simbolis sikap. Anyway, here goes:
Lekukan dari Kode

Tab adalah 8 karakter, dan dengan demikian indentations juga 8 karakter. Zindik ada gerakan yang mencoba membuat indentations 4 (atau 2) karakter dalam, dan yang serupa dengan mencoba untuk menetapkan nilai PI menjadi 3.

Alasan: Seluruh ide di balik lekukan yang jelas untuk menentukan di mana sebuah blok kontrol dimulai dan berakhir. Terutama bila Anda telah melihat layar langsung selama 20 jam, Anda akan menemukan banyak hal yang lebih mudah untuk melihat bagaimana lekukan berfungsi jika anda memiliki indentations besar.

Sekarang, beberapa orang akan mengklaim bahwa memiliki 8 karakter indentations membuat kode bergerak terlalu jauh ke kanan, dan membuat sulit untuk membaca pada 80-karakter layar terminal. Jawabannya itu adalah bahwa jika anda memerlukan lebih dari 3 tingkat lekukan, you're screwed anyway, dan harus memperbaiki program anda.

Singkatnya, 8-char indents memudahkan untuk membaca, dan memiliki manfaat tambahan peringatan Anda bila Anda fungsi nesting Anda terlalu jauh. Pelajaran yang peringatan.
Menempatkan Braces

Isu lain yang selalu muncul di C styling adalah penempatan braces. Berbeda dengan indent ukuran, ada beberapa alasan teknis untuk memilih lebih dari satu strategi penempatan yang lain, tetapi pilihan cara, seperti yang ditunjukkan kepada kami oleh para nabi dan Kernighan Ritchie, adalah dengan menempatkan membuka kurawal pada baris terakhir, dan menempatkan penutupan kurawal pertama, thusly:

x is true ) { if (x is true) (
y kita lakukan
)

Namun, ada satu hal khusus, yaitu fungsi: mereka telah membuka brace di awal baris berikutnya, sehingga:

int x ) int fungsi (int x)
(
fungsi tubuh
)

Heretic orang di seluruh dunia telah menyatakan bahwa ini adalah konsisten dengan baik ... ... tidak konsisten, tetapi semua hak-orang berpikir bahwa (a) K & R adalah _right_ dan (b) K & R are right. Selain itu, fungsi-fungsi khusus anyway (Anda tidak dapat bersarang di C).

Perlu diketahui bahwa penutupan brace kosong pada baris sendiri, _except_ dalam keadaan di mana ia diikuti dengan lanjutan dari pernyataan yang sama, yaitu sebuah "sementara" dalam melakukan-pernyataan atau "orang lain" dalam sebuah pernyataan jika - , seperti ini:

do (
tubuh lakukan - lingkaran
( condition ) ; ) While (kondisi);

dan

x == y ) { if (x == y) (
..
( x & gt ; y ) { ) Else if (x & gt; y) (
...
{ ) Else (
....
)

amp ; R. Alasan: K & amp; R.

Selain itu, perlu diketahui bahwa alat-penempatan juga minimizes jumlah kosong (atau hampir kosong) baris tanpa kehilangan dibaca. Oleh karena itu, sebagai persediaan baru-garis pada layar Anda bukan merupakan sumberdaya diperbaharui (25-kira baris terminal layar disini), Anda memiliki lebih banyak baris kosong untuk menempatkan komentar tentang.
Konvensi penamaan

C adalah bahasa Spartan, sehingga Anda harus memberi nama itu. Tidak seperti modul-2 dan pemrogram Pascal, C pemrogram tidak menggunakan nama seperti ThisVariableIsATemporaryCounter cute. AC programmer variabel yang akan memanggil "tmp", yang lebih mudah untuk menulis, dan tidak sedikit lebih sulit dimengerti.

Namun, saat dicampur-kasus nama frowned upon, nama deskriptif untuk variabel global adalah harus. Untuk memanggil global fungsi "foo" adalah gambar offense.

GLOBAL variabel (yang akan digunakan hanya jika Anda membutuhkannya _really_) harus memiliki nama deskriptif, seperti melakukan fungsi global. Jika Anda memiliki fungsi yang menghitung jumlah pengguna aktif, panggilan yang harus Anda "count_active_users ()" atau serupa, Anda harus _not_ sebut "cntusr ()".

Encoding jenis fungsi menjadi nama (yang disebut notasi Hungaria) adalah kerusakan otak - compiler mengetahui jenis saja dan dapat memeriksa mereka, dan hanya ada yang membingungkan programmer. Tidak heran Microsoft membuat program buggy.

LOCAL nama variabel harus singkat, dan to the point. Jika Anda memiliki beberapa acak integer loop counter, mungkin harus dipanggil "i". Calling it "loop_counter" non-produktif, jika tidak ada kesempatan yang menjadi salah dimengerti. Demikian pula, "tmp" dapat saja tentang segala jenis variabel yang digunakan untuk menyimpan sementara nilai. Jika anda takut untuk mengacaukan nama variabel lokal Anda, Anda memiliki masalah, yang disebut-fungsi-hormon pertumbuhan-ketimpangan syndrome. Lihat bab berikutnya.
Fungsi

Fungsi harus singkat dan manis, dan hanya melakukan satu hal. Mereka harus muat di satu atau dua screenfuls teks (ISO / ANSI layar ukuran 80 × 24, seperti yang kita semua tahu), dan melakukan satu hal dan melakukannya dengan baik.

Panjang maksimal adalah fungsi inversely proporsional dengan kompleksitas dan tingkat lekukan yang berfungsi. Jadi, jika Anda memiliki
konseptual sederhana yang berfungsi hanya satu panjang (tapi sederhana) kasus-pernyataan, di mana Anda harus melakukan banyak hal-hal kecil untuk banyak
berbagai kasus, it's OK untuk memiliki fungsi yang lebih panjang.

Namun, jika Anda memiliki fungsi yang kompleks, dan Anda menduga bahwa kurang-dari-gifted pertama tahun tinggi sekolah siswa bahkan tidak mungkin
memahami apa fungsi adalah semua tentang, Anda harus mematuhi semua batas maksimum yang lebih erat. Gunakan fungsi penolong dengan nama deskriptif (Anda dapat meminta compiler pada baris-mereka jika Anda berpikir performa penting, dan mungkin akan melakukan pekerjaan yang lebih baik dari yang akan dilakukan).

Lain ukuran fungsi adalah jumlah variabel lokal. Mereka tidak boleh melebihi 5-10, atau anda melakukan sesuatu yang salah. Kembali rasa
fungsi, dan terpecah menjadi bagian kecil. J otak manusia umumnya dapat dengan mudah melacak 7 berbeda tentang sesuatu, yang lebih dan jadi bingung. You know you're brilliant, tetapi mungkin anda ingin memahami apa yang anda lakukan 2 bulan dari sekarang.
Komentar

Komentar yang bagus, tetapi ada juga bahaya over-komentar. NEVER mencoba menjelaskan CARA kode bekerja di komentar: it's much etter menulis kode sehingga _working_ adalah jelas, dan It'sa buang waktu untuk menjelaskan sangat tertulis kode.

Secara umum, Anda ingin komentar Anda kirim ke APA kode tidak, bukan CARA. Juga, cobalah untuk menghindari meletakkan komentar di dalam tubuh fungsi: jika fungsi sangat kompleks yang harus Anda secara terpisah komentar bagian ini, Anda mungkin harus kembali ke bab 4 untuk sementara waktu. Anda dapat membuat catatan kecil atau komentar untuk memperingatkan tentang sesuatu khususnya pandai (atau jelek), tetapi mencoba untuk menghindari kelebihan. Sebagai gantinya, taruh komentar di kepala fungsi, mengatakan apa yang tidak orang, dan kemungkinan ia MENGAPA
ini.
Anda telah membuat mess it

That's OK, semua kita lakukan. Anda mungkin sudah pernah diberitahu oleh lama waktu yang penolong pengguna Unix "GNU emacs" secara otomatis format C untuk sumber
Anda, dan Anda menyadari bahwa ya, ia melakukan itu, tetapi ia menggunakan default yang kurang dari yang diharapkan (pada kenyataannya, mereka lebih buruk daripada mengetik acak - yang tak terbatas jumlah monkeys mengetik ke GNU emacs tidak akan pernah membuat program yang bagus ).

Jadi, anda boleh membuang GNU emacs, atau mengubahnya untuk menggunakan nilai saner. Untuk melakukan yang kedua, Anda dapat tetap berikut Anda. Emacs file:

c - mode ( ) "C mode with adjusted defaults for use with the Linux kernel." (Defun linux - c - mode () "C disesuaikan dengan mode default untuk digunakan dengan kernel Linux."
(Interaktif)
mode ) (C - modus)
set - style "K&R" ) (C - set - gaya "K & R")
basic - offset 8 ) ) (Setq c - dasar - offset 8))

Hal ini akan menentukan MX linux-c-mode perintah. Ketika hacking pada modul, jika anda menaruh string -*- linux-c -*- somewhere di dua baris pertama, mode ini akan secara otomatis invoked. Juga, mungkin Anda ingin menambahkan

(setq auto-mode-alist (cons' ( "/ usr / src / linux .*/.* \. [ch] $". linux-c-mode)
auto-mode-alist))

Anda. emacs file jika Anda ingin memiliki linux-c-mode diaktifkan automagically sumber saat mengedit file dalam / usr / src / linux.

Tetapi bahkan jika anda gagal mendapatkan emacs untuk memformat bijaksana, tidak semuanya hilang: gunakan "indent".

Sekarang, sekali lagi, GNU indent telah mati otak yang sama pengaturan yang telah GNU emacs, yang mengapa anda perlu memberikan beberapa opsi perintah baris. Namun, hal tersebut tidak terlalu buruk, karena bahkan keputusan dari GNU indent mengakui kewenangan K & R (GNU bukan orang jahat, mereka hanya sangat sesat dalam hal ini), sehingga Anda hanya memberikan pilihan indent "-kr -i8 "(singkatan dari" K & R, 8 indents karakter ").

"Indent" memiliki banyak pilihan, dan terutama ketika datang untuk memformat ulang komentar Anda mungkin ingin melihat di halaman manual. Tapi ingat: "indent" bukan merupakan program untuk memperbaiki buruk.
Konfigurasi-file

Untuk konfigurasi pilihan (arch / xxx / config.in, dan semua Config.in file), agak berbeda dekik digunakan.

Suatu lekuk tingkat 3 digunakan dalam kode, sementara teks dalam konfigurasi-pilihan harus memiliki lekukan-tingkat 2 untuk menunjukkan dependensi. Yang terakhir hanya berlaku untuk bool / tiga pilihan. Untuk pilihan lain, hanya usecommon sense. Contoh:

"$CONFIG_EXPERIMENTAL" = "y" ] ; then if [ "$ CONFIG_EXPERIMENTAL" = "y"]; kemudian
tiga 'Terapkan nitrogliserin dalam keyboard (DANGEROUS)' CONFIG_BOOM
"$CONFIG_BOOM" ! = "n" ] ; then if [ "$ CONFIG_BOOM"! = "n"], kemudian
CONFIG_CHEER bool 'Output nice pesan bila Anda meledak' CONFIG_CHEER
fi
fi

Umumnya, harus CONFIG_EXPERIMENTAL surround semua pilihan tidak dianggap stabil. Semua pilihan yang diketahui sampah data (percobaan menulis dukungan untuk file sistem, misalnya) harus denoted (DANGEROUS), Eksperimental pilihan lainnya harus denoted (percobaan).
Struktur data

Struktur data yang ada di luar visibilitas tunggal Thread lingkungan mereka diciptakan dan dimusnahkan pada harus selalu ada acuan menghitung. Di kernel, sampah tidak ada (dan di luar kernel sampah yang lambat dan tidak efisien), yang berarti bahwa Anda benar-benar _have_ untuk referensi Anda menggunakan hitungan semua.

Referensi menghitung berarti Anda dapat menghindari penguncian, dan memungkinkan beberapa pengguna memiliki akses ke data dalam struktur paralel - havingto dan tidak khawatir tentang struktur tiba-tiba terjadi di bawah jauh dari mereka hanya karena mereka tidur atau melakukan sesuatu yang lain untuk sementara waktu.

Perlu diketahui bahwa penguncian _not_ adalah pengganti untuk referensi dihitung. Penguncian yang digunakan untuk menyimpan data struktur koheren, sedangkan referensi yang dihitung adalah memori manajemen teknik. Biasanya keduanya diperlukan, dan mereka tidak menjadi bingung dengan satu sama lain.

Banyak struktur data dapat benar-benar memiliki dua tingkat referensi dihitung, apabila ada pengguna yang berbeda "kelas". Count the subclass counts subclass jumlah pengguna, dan decrements global hanya dihitung sekali bila dihitung subclass pergi ke nol.

Contoh dari jenis ini "multi-referensi-hitungan" dapat ditemukan dalam manajemen memori ( "struct mm_struct": mm_users dan mm_count), dan di
kode filesystem ( "struct super_block": s_count dan s_active). Ingat: thread lain jika anda dapat menemukan struktur data, dan anda tidak memiliki referensi count on it, Anda hampir pasti ada bug.

 
Top