A second prize solution would be to ifdef a MSVC and a GCC solution.
In C++14, you can mark a function as deprecated using the
[[deprecated]] attribute (see section 7.6.5 [dcl.attr.deprecated]).
deprecatedcan be used to mark names and entities whose use is still allowed, but is discouraged for some reason.
For example, the following function
foo is deprecated:
[[deprecated]] void foo(int);
It is possible to provide a message that describes why the name or entity was deprecated:
[[deprecated("Replaced by bar, which has an improved interface")]] void foo(int);
The message must be a string literal.
For further details, see “Marking as deprecated in C++14”.
This should do the trick:
#ifdef __GNUC__ #define DEPRECATED(func) func __attribute__ ((deprecated)) #elif defined(_MSC_VER) #define DEPRECATED(func) __declspec(deprecated) func #else #pragma message("WARNING: You need to implement DEPRECATED for this compiler") #define DEPRECATED(func) func #endif ... //don't use me any more DEPRECATED(void OldFunc(int a, float b)); //use me instead void NewFunc(int a, double b);
However, you will encounter problems if a function return type has a commas in its name e.g.
std::pair<int, int> as this will be interpreted by the preprocesor as passing 2 arguments to the DEPRECATED macro. In that case you would have to typedef the return type.
Edit: simpler (but possibly less widely compatible) version here.