| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- * The LAME API is frozen. Poorly designed as it is, don't change it,
- and add to it sparingly.
- * Don't take it upon yourself to go through LAME with the sole purpose
- of updating everything to match this guide. Especially important:
- don't change the spacing, indentation, curly braces, etc,
- in routines you did not write.
- * If you want to make a change which effects many many functions,
- please check with the maintainer first.
- * Respect the indentation of the author of the original function.
- If the indentation is not consistent, use 4.
- * Don't use tabulators (the character with the value '\t') in source code,
- especially these with a width of unequal 8. Lame sources are using
- different sizes for tabulators.
- * Don't set the macro NDEBUG in alpha versons.
- NDEBUG should be set for beta versions.
- * check important assumptions with an assert()
- * use int for all integer quantities.
- LAME requires 32 bit ints, so you can assume int is at least 32 bits.
- Don't use 'long'. Don't use 'unsigned' unless ABSOLUTELY necessary.
- Don't use 'char' just to save bytes. If 64 bits is required, use int64.
- Annnotation:
- ISO C calls the 64 bit int type not int64 but int64_t.
- * Avoid using float or double, and instead use: (defined in machine.h).
- FLOAT for variables which require at least 32bits
- FLOAT8 for variables which require at least 64bits
- On some machines, 64bit will be faster than 32bit. Also, some math
- routines require 64bit float, so setting FLOAT=float will result in a
- lot of conversions.
- Annotation (pfk):
- The new ISO C standard passed in autumn 1999 has defined new types for
- exactly this reason. There are called float_least32_t and float_least64_t
- and have at least the advantage that you not need to explain their
- meaning.
- Annotation (mt):
- we will adopt this convention in Jan 1, 2003.
- * The internal representation of PCM samples in type 'sample_t',
- currently this is a FLOAT.
- * Use SI base units. Lame mixes Hz, kHz, kbps, bps. This is mess.
- Example:
- float wavelength_green = 555.e-9;
- unsigned data_rate = 128000;
- float lowpass_freq = 12500.;
-
- Converting between user input and internal representation should be done
- near the user interface, not in the most inner loop of an utility
- function.
- ----------------------------------------------------------------------------------
- Edited version of the Linux Kernel Style Guide:
- ----------------------------------------------------------------------------------
- Chapter 1: Indentation
- Respect the indentation of the author of the original function.
- If the indentation is not consistent, don't change it. If
- you are so anal-retentive about these things and you can't
- bare to even look at code with poor indentation, change it to 4.
- Chapter 2: Placing Braces
- The other issue that always comes up in C styling is the placement of
- braces. Unlike the indent size, there are few technical reasons to
- choose one placement strategy over the other, but the preferred way, as
- shown to us by the prophets Kernighan and Ritchie, is to put the opening
- brace last on the line, and put the closing brace first, thusly:
- if (x is true) {
- we do y
- }
- However, there is one special case, namely functions: they have the
- opening brace at the beginning of the next line, thus:
- int function(int x)
- {
- body of function
- }
- Heretic people all over the world have claimed that this inconsistency
- is ... well ... inconsistent, but all right-thinking people know that
- (a) K&R are _right_ and (b) K&R are right. Besides, functions are
- special anyway (you can't nest them in C).
- Note that the closing brace is empty on a line of its own, _except_ in
- the cases where it is followed by a continuation of the same statement,
- ie a "while" in a do-statement or an "else" in an if-statement, like
- this:
- do {
- body of do-loop
- } while (condition);
- and
- if (x == y) {
- ..
- } else if (x > y) {
- ...
- } else {
- ....
- }
-
- Rationale: K&R.
- Also, note that this brace-placement also minimizes the number of empty
- (or almost empty) lines, without any loss of readability. Thus, as the
- supply of new-lines on your screen is not a renewable resource (think
- 25-line terminal screens here), you have more empty lines to put
- comments on.
- Chapter 3: Naming
- C is a Spartan language, and so should your naming be. Unlike Modula-2
- and Pascal programmers, C programmers do not use cute names like
- ThisVariableIsATemporaryCounter. A C programmer would call that
- variable "tmp", which is much easier to write, and not the least more
- difficult to understand.
- HOWEVER, while mixed-case names are frowned upon, descriptive names for
- global variables are a must. To call a global function "foo" is a
- shooting offense.
- GLOBAL variables (to be used only if you _really_ need them) need to
- have descriptive names, as do global functions. If you have a function
- that counts the number of active users, you should call that
- "count_active_users()" or similar, you should _not_ call it "cntusr()".
- Encoding the type of a function into the name (so-called Hungarian
- notation) is brain damaged - the compiler knows the types anyway and can
- check those, and it only confuses the programmer. No wonder MicroSoft
- makes buggy programs.
- LOCAL variable names should be short, and to the point. If you have
- some random integer loop counter, it should probably be called "i".
- Calling it "loop_counter" is non-productive, if there is no chance of it
- being mis-understood. Similarly, "tmp" can be just about any type of
- variable that is used to hold a temporary value.
-
- Chapter 4: Functions
- Document functions.
- Keep functions as modular as possible. But don't adhere to artificial
- line number limitations. For example, lame_encode_frame() encodes a
- single MP3 frame and is a long sequence of function calls. It makes
- no sense to break this into two or more routines.
- Chapter 5: Commenting
- Comments are good, but there is also a danger of over-commenting. NEVER
- try to explain HOW your code works in a comment: it's much better to
- write the code so that the _working_ is obvious, and it's a waste of
- time to explain badly written code.
- Generally, you want your comments to tell WHAT your code does, not HOW.
- Also, try to avoid putting comments inside a function body: if the
- function is so complex that you need to separately comment parts of it,
- you should probably go back to chapter 4 for a while. You can make
- small comments to note or warn about something particularly clever (or
- ugly), but try to avoid excess. Instead, put the comments at the head
- of the function, telling people what it does, and possibly WHY it does
- it.
|