qi helper macros¶
Summary¶
Reference¶
-
QI_API_DEPRECATED
-
QI_NORETURN
¶ Portable noreturn attribute, used to declare that a function does not return.
-
QI_HAS_VARIABLE_LENGTH_ARRAY
¶ Mark compilers supporting variable length array (VLA)
-
QI_LIB_API
-
QI_IMPORT_API
-
QI_EXPORT_API
-
QI_LIB_API_NORMALIZED
-
QI_COMPILER_WARNING(x)
¶ x
The string displayed as the warning.
-
QI_DEPRECATED_HEADER(x)
¶ Generate a compiler warning stating a header is deprecated. add a message to explain what user should do.
-
QI_DEPRECATE_MACRO(name)
¶ name
The name of the macro. * Example: * * .. code-block:: cpp * * #define MAX(x,y)(QI_DEPRECATE_MACRO(MAX), x > y ? x : y) *
-
QI_DISALLOW_COPY_AND_ASSIGN(type)
¶ DeprecatedUse boost::noncopyable instead.
Example:
class Foo : private boost::nonpyable {};
type
The class name of which we want to forbid copy.
Note
This macro should always be in the private (or protected) section of a class.
Example:
class Foo { Foo(); private: QI_DISALLOW_COPY_AND_ASSIGN(Foo); };
-
QI_WARN_UNUSED_RESULT
¶ This macro tags a result as unused.
-
QI_ATTR_UNUSED
¶ This macro tags a attribute as unused.
-
QI_UNUSED(x)
¶ Example:
int zero(int QI_UNUSED(x)) { return 0; }
-
QI_UNIQ_DEF(A)
¶ A macro to append the line number of the parent macro usage, to define a function in or a variable and avoid name collision.
-
QI_CXX11_ENABLED
¶
-
QI_NOEXCEPT(cond)
¶ Specify that a function may throw or not.
-
QI_ONCE(code)
¶ void myFunction() { QI_ONCE(std::cout << "first initialization" << std::endl); std::cout << "doing stuff" << std::endl; }
In this code, you have two guarantees: - “first initialization” will be written only once - “doing stuff” will never appear before “first initialization”
QI_ONCE is optimized so that further calls after initialization have the less overhead possible.
You can also put multiple instructions in a QI_ONCE.
QI_ONCE( doStuff(); doMoreStuff(); );
This macro is only useful in C++03 and the function above may be written in C++11:
void myFunction() { static std::once_flag flag; std::call_once(flag, [](){std::cout << "first initialization" << std::endl;}); std::cout << "doing stuff" << std::endl; }
-
QI_THREADSAFE_NEW(...)
¶ Accept a list of pointers (expected to be static function variables) and new them once in a thread-safe manner. Implementation aims for minimal overhead when initialization is done.
QI_THREADSAFE_NEW is there to provide a safe static initialization of variables in C++03. Its most common use case is the following:
static std::vector<int> vec; void threadSafeFunction() { static boost::mutex* mutex; // = 0 is optional QI_THREADSAFE_NEW(mutex); boost::mutex::scoped_lock l(*mutex); vec.push_back(0); }
Using a simple static boost::mutex does not guarantee safe initialization in a multithreaded environment in C++03 (even though GCC’s implementation is safe), that’s why QI_THREADSAFE_NEW is needed.
In C++11, the following is safe:
static std::vector<int> vec; void threadSafeFunction() { static boost::mutex mutex; boost::mutex::scoped_lock l(mutex); vec.push_back(0); }