Let qVersion() be extern "C" if this is not a namespace build
authorThiago Macieira <thiago.macieira@intel.com>
Wed, 29 Aug 2012 10:09:31 +0000 (12:09 +0200)
committerQt by Nokia <qt-info@nokia.com>
Mon, 17 Sep 2012 22:59:08 +0000 (00:59 +0200)
This allows one to even dlopen() QtCore and call qVersion, to figure
out which version it is. A bit crazy, but someone might want to do it.

Change-Id: I932460515d07bed3f0e41c8ab2b46fc268ca73ff
Reviewed-by: Qt Doc Bot <qt_docbot@qt-project.org>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
src/corelib/global/qglobal.h

index ac67d33..66b5049 100644 (file)
@@ -333,6 +333,19 @@ typedef double qreal;
     do { extern int QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) ();    \
         QT_MANGLE_NAMESPACE(qCleanupResources_ ## name) (); } while (0)
 
+/*
+ * If we're compiling C++ code:
+ *  - and this is a non-namespace build, declare qVersion as extern "C"
+ *  - and this is a namespace build, declare it as a regular function
+ *    (we're already inside QT_BEGIN_NAMESPACE / QT_END_NAMESPACE)
+ * If we're compiling C code, simply declare the function. If Qt was compiled
+ * in a namespace, qVersion isn't callable anyway.
+ */
+#if !defined(QT_NAMESPACE) && defined(__cplusplus) && !defined(Q_QDOC)
+extern "C"
+#endif
+Q_CORE_EXPORT const char *qVersion() Q_DECL_NOTHROW;
+
 #if defined(__cplusplus)
 
 #ifndef Q_CONSTRUCTOR_FUNCTION
@@ -558,7 +571,6 @@ Q_NORETURN Q_CORE_EXPORT void qTerminate() Q_DECL_NOTHROW;
 #  endif
 #endif
 
-Q_CORE_EXPORT const char *qVersion() Q_DECL_NOTHROW;
 Q_CORE_EXPORT bool qSharedBuild() Q_DECL_NOTHROW;
 
 #ifndef Q_OUTOFLINE_TEMPLATE