CODING_STYLE.md
This article describes general coding style guidelines, which should be used for new ReactOS code. These guidelines apply exclusively to C and C++ source files. The Members of ReactOS agreed on this document in the October 2013 meeting.
As much existing ReactOS code as possible should be converted to this style unless there are reasons against doing this (like if the code is going to be rewritten from scratch in the near future). See Notes on reformatting existing code for more details.
Code synchronized with other sources (like Wine) must not be rewritten. 3rd Party Files.txt and WINESYNC.txt files can be used for tracking synchronized files.
/*
* PROJECT: ReactOS Kernel
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Does cool things like Memory Management
* COPYRIGHT: Copyright 2017 Arno Nymous <[email protected]>
* Copyright 2017 Mike Blablabla <[email protected]>
*/
Please use SPDX license identifiers available at https://spdx.org/licenses. This makes our source file parseable by licensing tools!
You should add yourself to the COPYRIGHT section of a file if you did a major contribution to it and could take responsibility for the whole file or a part of it. Not more than 3 people shall be in that list for each file.
FILE line of the old header should be removed.
Right:
switch (Condition)
{
case 1:
DoSomething();
break;
case 2:
{
DoMany();
ManyMore();
OtherThings();
break;
}
}
Wrong:
switch(Condition)
{
case 1:
DoSomething();
break;
case 2:
DoMany();
ManyMore();
OtherThings();
break;
}
FunctionCall(arg1,
arg2,
arg3);
static // scope identifier
CODE_SEG("PAGE") // section placement
// other attributes
BOOLEAN // return type
FASTCALL // calling convention
IsOdd(
_In_ UINT32 Number);
Do not use spaces around unary operators.
Right: i++;
Wrong: i ++;
Place spaces around binary and ternary operators.
Right: a = b + c;
Wrong: a=b+c;
Do not place spaces before comma and semicolon.
Right:
for (int i = 0; i < 5; i++)
DoSomething();
func1(a, b);
Wrong:
for (int i = 0; i < 5 ; i++)
DoSomething();
func1(a , b) ;
Right:
if (Condition)
DoSomething();
Wrong:
if(Condition)
DoSomething();
Right:
func(a, b);
Wrong:
func (a, b);
func( a, b );
Right:
x++;
y++;
if (Condition)
DoSomething();
Wrong:
x++; y++;
if (Condition) DoSomething();
{ and }) on their own lines.Right:
if (Condition)
DoSomething();
if (Condition)
{
DoSomething();
}
if (Condition)
{
// This is a comment
DoSomething();
}
if (A_Very || (Very && Long || Condition) &&
On_Many && Lines)
{
DoSomething();
}
if (Condition)
DoSomething();
else
DoSomethingElse();
if (Condition)
{
DoSomething();
}
else
{
DoSomethingElse();
YetAnother();
}
Wrong:
if (Condition) {
DoSomething();
}
if (Condition)
// This is a comment
DoSomething();
if (A_Very || (Very && Long || Condition) &&
On_Many && Lines)
DoSomething();
if (Condition)
DoSomething();
else {
DoSomethingElse();
YetAnother();
}
Don't use inverse logic in control clauses.
Right: if (i == 1)
Wrong: if (1 == i)
Avoid too many levels of cascaded control structures. Prefer a "linear style" over a "tree style". Use goto when it helps to make the code cleaner (e.g. for cleanup paths).
Right:
if (!func1())
return;
i = func2();
if (i == 0)
return;
j = func3();
if (j == 1)
return;
...
Wrong:
if (func1())
{
i = func2();
if (func2())
{
j = func3();
if (func3())
{
...
}
}
}
Right:
PLIST_ENTRY FirstEntry;
VOID NTAPI IopDeleteIoCompletion(PVOID ObjectBody);
PWSTR pwszTest;
Wrong:
PLIST_ENTRY first_entry;
VOID NTAPI iop_delete_io_completion(PVOID objectBody);
PWSTR pwsztest;
Avoid abbreviating function and variable names, use descriptive verbs where possible.
Precede boolean values with meaningful verbs like "is" and "did" if possible and if it fits the usage.
Right:
BOOLEAN IsValid;
BOOLEAN DidSendData;
Wrong:
BOOLEAN Valid;
BOOLEAN SentData;
Right:
// This is a one-line comment
/* This is a C-style comment */
// This is a comment over multiple lines.
// We don't define any strict rules for it.
Wrong:
//
// This comment wastes two lines
//
The null pointer should be written as NULL. In the rare case that your environment recommends a different null pointer (e.g. C++11 nullptr), you may use this one of course. Just don't use the value 0.
Win32/NT Boolean values should be written as TRUE and FALSE. In the rare case that you use C/C++ bool variables, you should write them as true and false.
When you need to terminate ANSI or OEM string, or check for its terminator, use ANSI_NULL. If the string is Unicode or Wide string, use UNICODE_NULL.
LARGE_INTEGER/ULARGE_INTEGER unless needed for using APIs. Use INT64/UINT64 instead#pragma once instead of guard defines in headersTO BE ADDED BY User:Zefklop
Additional ideas were suggested during the discussion of this document, but a consensus couldn't be reached on them. Therefore we refrain from enforcing any rules on these points: