llvm-prefer-static-over-anonymous-namespace

Finds function and variable declarations inside anonymous namespace and suggests replacing them with static declarations.

The LLVM Coding Standards recommend keeping anonymous namespaces as small as possible and only use them for class declarations. For functions and variables the static specifier should be preferred for restricting visibility.

For example non-compliant code:

namespace { class StringSort { public:  StringSort(...)  bool operator<(const char *RHS) const; }; // warning: place method definition outside of an anonymous namespace bool StringSort::operator<(const char *RHS) const {} // warning: prefer using 'static' for restricting visibility void runHelper() {} // warning: prefer using 'static' for restricting visibility int myVariable = 42; } 

Should become:

// Small anonymous namespace for class declaration namespace { class StringSort { public:  StringSort(...)  bool operator<(const char *RHS) const; }; } // placed method definition outside of the anonymous namespace bool StringSort::operator<(const char *RHS) const {} // used 'static' instead of an anonymous namespace static void runHelper() {} // used 'static' instead of an anonymous namespace static int myVariable = 42; 

Options

AllowVariableDeclarations

When true, allow variable declarations to be in anonymous namespace. Default value is true.

AllowMemberFunctionsInClass

When true, only methods defined in anonymous namespace outside of the corresponding class will be warned. Default value is true.