📄 code_standard
字号:
Formatting rules for Motion code.Motion is coded in accordance with the K&R formatting style. Indentation isTAB based but done so that formatting never depends upon how a text editor ortext viewer represents a TAB.Some people assume a tab is always at multiples of 8 positions, but manyothers choose to use 4 or 6. If the source file does not take this intoconsideration, the text alignment looks awful when viewed with a tab settingwhich differs from the original.We want to ensure that no matter which motion source file you look at, thestyle looks the same. In order to do that, the Motion project enforces someadditional rules.Here are the basic rules.Note: To understand them you must view this document with spaces and tabsvisible.--------------------RULE 1Code is generally indented using TABSExample1/* allocate some memory and check if that succeeded or not. If it failed * do some error logging and bail out */void * mymalloc(size_t nbytes){ void *dummy = malloc(nbytes); if (!dummy) { printf("Could not allocate %llu bytes of memory!\n", (unsigned long long) nbytes); syslog(LOG_EMERG, "Could not allocate %llu bytes of memory!", (unsigned long long) nbytes); exit(1); } return dummy;}--------------------RULE 2If a line or statement is broken into two lines you will normally want the textin the 2nd line to align with text in the first line. This alignment must bedone by following these rules: 1. On the continuation line, first you put tabs to reach the same indentation level as the line above. 2. Then you align with SPACES until the text in the 2nd line is aligned with the desired text above.Example 2/* allocate some memory and check if that succeeded or not. If it failed * do some error logging and bail out */void * mymalloc(size_t nbytes){ void *dummy = malloc(nbytes); if (!dummy) { printf("Could not allocate %llu bytes of memory!\n", (unsigned long long) nbytes); syslog(LOG_EMERG, "Could not allocate %llu bytes of memory!", (unsigned long long) nbytes); exit(1); } return dummy;}Never do this:WRONG EXAMPLE printf("Could not allocate %llu bytes of memory!\n", (unsigned long long) nbytes);The reason is that the 3rd tab will be shown with whatever width is given bythe editor or viewer. The result is that you never know where the text ends.The alignment of the text is very important for the readability of the code.GOOD EXAMPLE cnt->sql_mask = cnt->conf.sql_log_image * (FTYPE_IMAGE + FTYPE_IMAGE_MOTION) + cnt->conf.sql_log_snapshot * FTYPE_IMAGE_SNAPSHOT + cnt->conf.sql_log_mpeg * (FTYPE_MPEG + FTYPE_MPEG_MOTION) + cnt->conf.sql_log_timelapse * FTYPE_MPEG_TIMELAPSE;BAD EXAMPLE cnt->sql_mask = cnt->conf.sql_log_image * (FTYPE_IMAGE + FTYPE_IMAGE_MOTION) + cnt->conf.sql_log_snapshot * FTYPE_IMAGE_SNAPSHOT + cnt->conf.sql_log_mpeg * (FTYPE_MPEG + FTYPE_MPEG_MOTION) + cnt->conf.sql_log_timelapse * FTYPE_MPEG_TIMELAPSE;GOOD EXAMPLE char msg[] = "This is a very long message which we would like to break" "into two lines or more because otherwise the line gets" "too long to read. We align them below each other for readability"BAD EXAMPLE char msg[] = "This is a very long message which we would like to break" "into two lines or more because otherwise the line gets" "too long to read. We align them below each other for readability"Again, a different tab setting destroys alignment.--------------------RULE 3Never use TABS to align anything other than the start of line indentation.WRONG EXAMPLE * * cnt Pointer to the motion context structure * level logging level for the 'syslog' function * (-1 implies no syslog message should be produced) * errno_flag if set, the log message should be followed by the * error message. * fmt the format string for producing the message * ap variable-length argument list THE CORRECT WAY * * cnt Pointer to the motion context structure * level logging level for the 'syslog' function * (-1 implies no syslog message should be produced) * errno_flag if set, the log message should be followed by the * error message. * fmt the format string for producing the message * ap variable-length argument listAgain the reason is that the aligment of the text when using tabs isdepending on the tab settings in editor or viewer.BAD EXAMPLEvoid function_a(void someparam){ int myvar1 /* explanation */ char hellomyvar2 /* explanation */In this bad example the variable names will not align if the tab setting isnot 8 positions. At 4 positions, for example, the variable names (as well asthe comments) are no longer aligned.GOOD EXAMPLEvoid function_a(void someparam){ int myvar1 /* explanation */ char hellomyvar2 /* explanation */Don't try and align variables. It does not become very readable when one typeis int and another is unsigned long long int. There is too much white spacebetween a short type name and the variable name. Comments after the variablename look good, provided that you use spaces to align them.--------------------RULE 4Functions should be written with this syntax.GOOD EXAMPLE/* Comment block * A comment block should be at least one line saying what the function does. * It is better to make several lines explaining what it does, what it takes * for arguments and what it returns. It is a bad idea to try to use tabs to * align text in the comment block */type function_name(parameters){ declarations declarations statements statements}Do not split the function declaration into two lines.Do not put the '{' after the function declaration. Put it on an empty lineright after. Note that this rule is only for functions.BAD EXAMPLEtypefunction_name(parameters) { declarations declarations statements statements}--------------------RULE 5Blocks follow K&R.Kenneth Lavrsen actually hates the K&R syntax, but it is the most generallyaccepted way, it was the way Motion was coded when Kenneth took over theproject and it is now the way in which we will continue.GOOD EXAMPLEif ((picture=fopen(cnt->conf.mask_file, "r"))) { cnt->imgs.mask=get_pgm(cnt, picture, cnt->imgs.width, cnt->imgs.height); fclose(picture);} else { put_fixed_mask(cnt, cnt->conf.mask_file); printf("Hello world\n");}BAD EXAMPLE (even though Kenneth loves this one personally)if ((picture=fopen(cnt->conf.mask_file, "r"))){ cnt->imgs.mask=get_pgm(cnt, picture, cnt->imgs.width, cnt->imgs.height); fclose(picture);}else{ put_fixed_mask(cnt, cnt->conf.mask_file); printf("Hello world\n");}--------------------RULE 6Whitespace.To ensure that Motion code looks homogeneous and to enhance readability: 1. Do not use a space before a comma 2. Always leave at least one space after a comma 3. Use one space between a block start statement and a '{' 4. Do not use a space between a function name and the '(' 5. Use spaces to enhance readability (a non objective rule but at least think about it) 6. The '*' for pointers should be just before the variable name with no space.BAD EXAMPLESint function_name (int * par1 , int par2,int par3){if (var1==2||var2==3){GOOD EXAMPLESint function_name(int *par1, int par2, int par3) {if (var1==2 || var2==3) {--------------------RULE 7Comment your codeThat's worth repeating - PLEASE, PLEASE comment your code.We receive far too much code which is completely uncommented and wherevariable names are short and say nothing about their function.Use /* This style of comment for permament comments */ or/* * This style of comment for comments which * require more that one line */Use // this style comments for something you add temporarily while testing andFIXME type comments. It is much easier to spot the temporary comments this way.--------------------RULE 8Use variable names that say what the variable is used for.Avoid x,t,vt type variable names.Use names like image, image_buffer, image_height, output_bufferShort names like i and j for loop index variable are a known good practice.Variable and function names are in lower case. Use '_' to separate words.MACROS are in uppercase.camelCase (mix of upper and lower case) is not allowed because it creates toomany typos for many two finger typers.--------------------BEST PRACTICESNot rules, but these suggestions make code easier to read.Use lots of white space and empty lines to group code.For example, large if statements are easier to read when there is an emptyline before and after them.Use an empty line before a comment which describes the code lines below.Always use spaces in statements likethisvar->thismember>thisvar->thisothermember (bad)thisvar->thismember > thisvar->thisothermember (good)if (cnt->event_nr==cnt->prev_event||cnt->makemovie) (bad)if (cnt->event_nr == cnt->prev_event || cnt->makemovie) (good)frame_delay=(1000000L/cnt->conf.low_cpu)-frame_delay-elapsedtime; (bad)frame_delay = (1000000L/cnt->conf.low_cpu) - frame_delay - elapsedtime; (good)--------------------This document can probably be enhanced more as time goes by.Hope it helps developers to understand the ideas.What happens if I do not follow the rules?Your code will probably be accepted, but Kenneth will have to spend a lot oftime rewriting the code to follow the standard. If this happens, he may makea less-than-complimentary remark. Please help Kenneth by at least trying tofollow the spirit of this document. We all have our coding preferences, butif Motion is coded in 40 different styles, readability (and at the endquality) will become bad.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -