mirror of
https://github.com/cpp-best-practices/cppbestpractices.git
synced 2025-12-17 11:14:35 +03:00
Merge pull request #4 from ralphtandetzky/master
Made a bunch of changes ranging from typos to explanations of the guidelines.
This commit is contained in:
34
03-Style.md
34
03-Style.md
@@ -90,9 +90,11 @@ int myFunc()
|
|||||||
|
|
||||||
which would be impossible if the function comment header used `/* */`
|
which would be impossible if the function comment header used `/* */`
|
||||||
|
|
||||||
## Never Use `using` In a Header File
|
## Never Use `using namespace` In a Header File
|
||||||
|
|
||||||
This causes the name space you are `using` to be pulled into the namespace of the header file.
|
This causes the name space you are `using` to be pulled into the namespace of the header file.
|
||||||
|
It litters the own namespace and it may lead to name collisions in the future.
|
||||||
|
Writing `using namespace` in an implementation file is fine though.
|
||||||
|
|
||||||
|
|
||||||
## Include Guards
|
## Include Guards
|
||||||
@@ -111,6 +113,9 @@ class MyClass {
|
|||||||
#endif
|
#endif
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You may also consider to use the `#pragma once` directive instead which is quasi standard across many compilers.
|
||||||
|
It's short and makes the intent clear.
|
||||||
|
|
||||||
|
|
||||||
## {} are required for blocks.
|
## {} are required for blocks.
|
||||||
Leaving them off can lead to semantic errors in the code.
|
Leaving them off can lead to semantic errors in the code.
|
||||||
@@ -155,6 +160,10 @@ if (x && y && myFunctionThatReturnsBool()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Many projects and coding standards have a soft guideline that one should try to use less than about 80 or 100 characters per line.
|
||||||
|
Such code is generally easier to read.
|
||||||
|
It also makes it possible to have two separate file next to each other on one screen without having a tiny font.
|
||||||
|
|
||||||
|
|
||||||
## Use "" For Including Local Files
|
## Use "" For Including Local Files
|
||||||
... `<>` is [reserved for system includes](http://blog2.emptycrate.com/content/when-use-include-verses-include).
|
... `<>` is [reserved for system includes](http://blog2.emptycrate.com/content/when-use-include-verses-include).
|
||||||
@@ -198,7 +207,7 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
// Good Idea
|
// Good Idea
|
||||||
// C++'s memeber initializer list is unique to the language and leads to
|
// C++'s member initializer list is unique to the language and leads to
|
||||||
// cleaner code and potential performance gains that other languages cannot
|
// cleaner code and potential performance gains that other languages cannot
|
||||||
// match
|
// match
|
||||||
class MyClass
|
class MyClass
|
||||||
@@ -214,6 +223,16 @@ private:
|
|||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
In C++11 you may consider to always give each member a default value, e.g. by writing
|
||||||
|
```cpp
|
||||||
|
// ... //
|
||||||
|
private:
|
||||||
|
int m_value = 0;
|
||||||
|
// ... //
|
||||||
|
```
|
||||||
|
inside the class body. This makes sure that no constructor ever "forgets" to initialize a member object.
|
||||||
|
Forgetting to initialize a member is a source of undefined behaviour bugs which are often extremely hard to find.
|
||||||
|
|
||||||
|
|
||||||
## Always Use Namespaces
|
## Always Use Namespaces
|
||||||
|
|
||||||
@@ -224,16 +243,19 @@ There is almost never a reason to declare an identifier in the global namespaces
|
|||||||
Compiler definitions and macros are replaced by the pre-processor before the compiler is ever run. This can make debugging very difficult because the debugger doesn't know where the source came from.
|
Compiler definitions and macros are replaced by the pre-processor before the compiler is ever run. This can make debugging very difficult because the debugger doesn't know where the source came from.
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
|
// Bad Idea
|
||||||
|
#define PI 3.14159;
|
||||||
|
|
||||||
// Good Idea
|
// Good Idea
|
||||||
namespace my_project {
|
namespace my_project {
|
||||||
class Constants {
|
class Constants {
|
||||||
public:
|
public:
|
||||||
|
// if the above macro would be expanded, then the following line would be:
|
||||||
|
// static const double 3.14159 = 3.14159;
|
||||||
|
// which leads to an compile-time error. Sometimes such errors are hard to understand.
|
||||||
static const double PI = 3.14159;
|
static const double PI = 3.14159;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bad Idea
|
|
||||||
#define PI 3.14159;
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -260,9 +282,11 @@ assert(registerSomeThing()); // make sure that registerSomeThing() returns true
|
|||||||
```
|
```
|
||||||
|
|
||||||
The above code succeeds when making a debug build, but gets removed by the compiler when making a release build, giving you different behavior between debug and release builds.
|
The above code succeeds when making a debug build, but gets removed by the compiler when making a release build, giving you different behavior between debug and release builds.
|
||||||
|
This is because `assert()` is a macro which expands to nothing in release mode.
|
||||||
|
|
||||||
## Don't be afraid of templates
|
## Don't be afraid of templates
|
||||||
|
|
||||||
They can help you stick to DRY principles.
|
They can help you stick to DRY principles.
|
||||||
|
They should be preferred to macros, because macros do not honor namespaces, etc.
|
||||||
|
|
||||||
## Use operator overloads judiciously
|
## Use operator overloads judiciously
|
||||||
|
|||||||
Reference in New Issue
Block a user