95 lines · plain
1.. title:: clang-tidy - misc-definitions-in-headers2 3misc-definitions-in-headers4===========================5 6Finds non-extern non-inline function and variable definitions in header files,7which can lead to potential ODR violations in case these headers are included8from multiple translation units.9 10.. code-block:: c++11 12 // Foo.h13 int a = 1; // Warning: variable definition.14 extern int d; // OK: extern variable.15 16 namespace N {17 int e = 2; // Warning: variable definition.18 }19 20 // Warning: variable definition.21 const char* str = "foo";22 23 // OK: internal linkage variable definitions are ignored for now.24 // Although these might also cause ODR violations, we can be less certain and25 // should try to keep the false-positive rate down.26 static int b = 1;27 const int c = 1;28 const char* const str2 = "foo";29 constexpr int k = 1;30 namespace { int x = 1; }31 32 // Warning: function definition.33 int g() {34 return 1;35 }36 37 // OK: inline function definition is allowed to be defined multiple times.38 inline int e() {39 return 1;40 }41 42 class A {43 public:44 int f1() { return 1; } // OK: implicitly inline member function definition is allowed.45 int f2();46 47 static int d;48 };49 50 // Warning: not an inline member function definition.51 int A::f2() { return 1; }52 53 // OK: class static data member declaration is allowed.54 int A::d = 1;55 56 // OK: function template is allowed.57 template<typename T>58 T f3() {59 T a = 1;60 return a;61 }62 63 // Warning: full specialization of a function template is not allowed.64 template <>65 int f3() {66 int a = 1;67 return a;68 }69 70 template <typename T>71 struct B {72 void f1();73 };74 75 // OK: member function definition of a class template is allowed.76 template <typename T>77 void B<T>::f1() {}78 79 class CE {80 constexpr static int i = 5; // OK: inline variable definition.81 };82 83 inline int i = 5; // OK: inline variable definition.84 85 constexpr int f10() { return 0; } // OK: constexpr function implies inline.86 87 // OK: C++14 variable templates are inline.88 template <class T>89 constexpr T pi = T(3.1415926L);90 91When :program:`clang-tidy` is invoked with the `--fix-notes` option, this check92provides fixes that automatically add the ``inline`` keyword to discovered93functions. Please note that the addition of the ``inline`` keyword to variables94is not currently supported by this check.95