Difference between revisions of "Code Conventions"

From VideoLAN Wiki
Jump to navigation Jump to search
m (typos)
m (minor improvements)
Line 1: Line 1:
 
== Code conventions ==
 
== Code conventions ==
 +
Here you find conventions about how the {{VLC}} developers write their code.
  
 
=== Function naming ===
 
=== Function naming ===
  
All functions are named accordingly : module name (in lower case) + _ + function name (in mixed case, without underscores). For instance : intf_FooFunction. Static functions don't need usage of the module name.
+
All functions are named accordingly: ''module name'' (in lower case) + _ + ''function name'' (in mixed case, without underscores). For instance: <tt>intf_FooFunction</tt>. Static functions don't need the module name.
  
 +
=== Variable naming ===
  
=== Variable naming ===
+
We use Hungarian notation. That is, we have the following prefixes:
  
Hungarian notations are used, that means we have the following prefixes :
+
*<tt>i_</tt> for integers (sometimes <tt>l_</tt> for long integers)
 +
*<tt>b_</tt> for booleans
 +
*<tt>d_</tt> for doubles
 +
*<tt>f_</tt> for floats
 +
*Generally, we add a <tt>p</tt> when the variable is a pointer to a type
 +
**<tt>pf_</tt> for function pointers
 +
**<tt>psz_</tt> for a pointer to a string terminated by a zero (C-string)
  
    * i_ for integers (sometimes l_ for long integers) ;
+
If a variable has no basic type (for instance a complex structure), don't put any prefix (except <tt>p_</tt> if it's a pointer). After one prefix, put an explicit variable name in lower case. If several words are required, join them with an underscore (no mixed case).
    * b_ for booleans ;
 
    * d_ for doubles (sometimes f_ for floats) ;
 
    * pf_ for function pointers ;
 
    * psz_ for a Pointer to a String terminated by a Zero (C-string) ;
 
    * More generally, we add a p when the variable is a pointer to a type.  
 
  
If one variable has no basic type (for instance a complex structure), don't put any prefix (except p_ if it's a pointer). After one prefix, put an explicit variable name in lower case. If several words are required, join them with an underscore (no mixed case). Examples :
+
Examples:
  
    * data_packet_t * p_buffer;
+
*<tt>data_packet_t * p_buffer</tt>
    * char psz_msg_date[42];
+
*<tt>char psz_msg_date[42]</tt>
    * int pi_es_refcount[MAX_ES];
+
*<tt>int pi_es_refcount[MAX_ES];</tt>
    * void (* pf_next_data_packet)( int * );
+
*<tt>void (* pf_next_data_packet)( int * )</tt>
  
 
=== Macro usage ===
 
=== Macro usage ===
  
static inline are preferred over macros, for example:
+
Static inline is preferred over macros, for example:
 +
 
 +
<code>
 
   static inline void change_val(int * var, int val)
 
   static inline void change_val(int * var, int val)
 
   {
 
   {
 
       *var = val;
 
       *var = val;
 
   }
 
   }
 +
</code>
 
is preferred to
 
is preferred to
 +
<code>
 
   #define CHANGE_VAL(var_name, val) var_name = val;
 
   #define CHANGE_VAL(var_name, val) var_name = val;
 +
</code>
  
=== A few words about white spaces ===
+
=== A few words about white space ===
 
==== Indentation ====
 
==== Indentation ====
  
'''Never''' use tabs in the source (you're entitled to use them in the Makefile :-).  
+
'''Never''' use tabs in the source (nevertheless you're entitled to use them in the Makefile :-).  
  
Use set expandtab under vim or the equivalent under emacs.  
+
Use <tt>set expandtab</tt> under vim or the equivalent under emacs.
  
 
Indents are 4 spaces long.
 
Indents are 4 spaces long.
Line 45: Line 53:
 
==== Spaces ====
 
==== Spaces ====
  
Put spaces before and after operators, and inside brackets. For instance :
+
Put spaces before and after operators, and inside brackets. For instance:
  
 +
<code>
 
  for( i = 0; i < 12; i++, j += 42 );  
 
  for( i = 0; i < 12; i++, j += 42 );  
 +
</code>
  
 
==== Braces ====
 
==== Braces ====
  
Leave braces alone on their lines (GNU style). For instance :
+
Leave braces alone on their lines (GNU style). For instance:
  
 +
<code>
 
  if( i_es == 42 )
 
  if( i_es == 42 )
 
  {
 
  {
 
     p_buffer[0] = 0x12;
 
     p_buffer[0] = 0x12;
 
  }
 
  }
 +
</code>
  
 
=== Comments ===
 
=== Comments ===
 
          
 
          
 
 
ANSI C-style comments /* ... */ are more commonly used for historical reasons, though C++/C99 comments are tolerated, but please don't mix both in the same file.
 
ANSI C-style comments /* ... */ are more commonly used for historical reasons, though C++/C99 comments are tolerated, but please don't mix both in the same file.
  
Line 67: Line 78:
 
=== Switch statements ===
 
=== Switch statements ===
  
Case labels are on the same column as the switch
+
Case labels are on the same column as the <tt>switch</tt> keyword.
  
 
Example:
 
Example:
 +
<code>
 
  switch( p_item->i_type )
 
  switch( p_item->i_type )
 
  {
 
  {
Line 77: Line 89:
 
     break;
 
     break;
 
  }
 
  }
 +
</code>
  
 
[[Category:Coding]]
 
[[Category:Coding]]

Revision as of 21:22, 20 February 2008

Code conventions

Here you find conventions about how the VLC media player developers write their code.

Function naming

All functions are named accordingly: module name (in lower case) + _ + function name (in mixed case, without underscores). For instance: intf_FooFunction. Static functions don't need the module name.

Variable naming

We use Hungarian notation. That is, we have the following prefixes:

  • i_ for integers (sometimes l_ for long integers)
  • b_ for booleans
  • d_ for doubles
  • f_ for floats
  • Generally, we add a p when the variable is a pointer to a type
    • pf_ for function pointers
    • psz_ for a pointer to a string terminated by a zero (C-string)

If a variable has no basic type (for instance a complex structure), don't put any prefix (except p_ if it's a pointer). After one prefix, put an explicit variable name in lower case. If several words are required, join them with an underscore (no mixed case).

Examples:

  • data_packet_t * p_buffer
  • char psz_msg_date[42]
  • int pi_es_refcount[MAX_ES];
  • void (* pf_next_data_packet)( int * )

Macro usage

Static inline is preferred over macros, for example:

 static inline void change_val(int * var, int val)
 {
     *var = val;
 }

is preferred to

 #define CHANGE_VAL(var_name, val) var_name = val;

A few words about white space

Indentation

Never use tabs in the source (nevertheless you're entitled to use them in the Makefile :-).

Use set expandtab under vim or the equivalent under emacs.

Indents are 4 spaces long.

Spaces

Put spaces before and after operators, and inside brackets. For instance:

for( i = 0; i < 12; i++, j += 42 ); 

Braces

Leave braces alone on their lines (GNU style). For instance:

if( i_es == 42 )
{
   p_buffer[0] = 0x12;
}

Comments

ANSI C-style comments /* ... */ are more commonly used for historical reasons, though C++/C99 comments are tolerated, but please don't mix both in the same file.

Qt interface added conventions

Switch statements

Case labels are on the same column as the switch keyword.

Example:

switch( p_item->i_type )
{
case blabla:
    break;
default:
    break;
}