-/* although global macros with such names are normally bad, we want to have */
-/* another name for _T() which should be used to avoid confusion between */
-/* _T() and _() in wxWidgets sources */
-#define wxT(x) _T(x)
+/*
+ wxT_2 exists only for compatibility with wx 2.x and is the same as wxT() in
+ that version but nothing in the newer ones.
+ */
+#define wxT_2(x) x
+
+/*
+ wxS ("wx string") macro can be used to create literals using the same
+ representation as wxString does internally, i.e. wchar_t in Unicode build
+ under Windows or char in UTF-8-based Unicode builds and (deprecated) ANSI
+ builds everywhere (see wxStringCharType definition above).
+ */
+#if wxUSE_UNICODE_WCHAR
+ /*
+ As above with wxT(), wxS() argument is expanded if it's a macro.
+ */
+ #ifndef wxCOMPILER_BROKEN_CONCAT_OPER
+ #define wxS(x) wxCONCAT_HELPER(L, x)
+ #else
+ #define wxS(x) wxPREPEND_L(x)
+ #endif
+#else /* wxUSE_UNICODE_UTF8 || ANSI */
+ #define wxS(x) x
+#endif
+
+/*
+ _T() is a synonym for wxT() familiar to Windows programmers. As this macro
+ has even higher risk of conflicting with system headers, its use is
+ discouraged and you may predefine wxNO__T to disable it. Additionally, we
+ do it ourselves for Sun CC which is known to use it in its standard headers
+ (see #10660).
+ */
+#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
+ #ifndef wxNO__T
+ #define wxNO__T
+ #endif
+#endif
+
+#if !defined(_T) && !defined(wxNO__T)
+ #define _T(x) wxT(x)
+#endif