2.0 KiB
Preprocessor Settings
If you use --project
then Cppcheck will use the preprocessor settings from the imported project. Otherwise you'll probably want to configure the include paths, defines, etc.
Defines
Here is a file that has 2 preprocessor configurations (with A defined and without A defined):
#ifdef A
x = y;
#else
x = z;
#endif
By default Cppcheck will check all preprocessor configurations (except those that have #error in them). So the above code will by default be analyzed both with A
defined and without A
defined.
You can use -D
to change this. When you use -D
, cppcheck will by default only check the given configuration and nothing else. This is how compilers work. But you can use --force
or --max-configs
to override the number of configurations.
Check all configurations:
cppcheck file.c
Only check the configuration A:
cppcheck -DA file.c
Check all configurations when macro A is defined
cppcheck -DA --force file.c
Another useful flag might be -U
. It tells Cppcheck that a macro is not defined. Example usage:
cppcheck -UX file.c
That will mean that X is not defined. Cppcheck will not check what happens when X is defined.
Include paths
To add an include path, use -I
, followed by the path.
Cppcheck's preprocessor basically handles includes like any other preprocessor. However, while other preprocessors stop working when they encounter a missing header, cppcheck will just print an information message and continues parsing the code.
The purpose of this behaviour is that cppcheck is meant to work without necessarily seeing the entire code. Actually, it is recommended to not give all include paths. While it is useful for cppcheck to see the declaration of a class when checking the implementation of its members, passing standard library headers is highly discouraged because it will result in worse results and longer checking time. For such cases, .cfg files (see below) are the better way to provide information about the implementation of functions and types to cppcheck.