I have the following bit of code, I expect that given cstdio is included that the first line will be printed, however the second line is printed.
What am I doing wrong? is it possible to know if labels such as printf or strncmp or memcpy have been defined in the current translation unit at compile time?
#include <iostream>
#include <cstdio>
int main()
{
#ifdef printf
std::cout << "printf is defined.\n";
#else
std::cout << "printf NOT defined!\n";
#endif
return 0;
}
Is the reason because the preprocessor is run before variables and labels are introduced into the scope/TU?
In short is the following code bogus? :
http://code.google.com/p/cmockery/source/browse/trunk/src/example/calculator.c#35
#ifdefonly applies to preprocessor macros, defined with#define, not to symbols like function names and variables. You can imagine the preprocessor as an actual separate preliminary step, like running your code through a perl script, that occurs before the “real” compiler gets a crack at it.So there is no programmatic way to check whether symbols like
printfare defined in the current scope. If you use one and it’s not defined, you’ll get a compiler error. The normal thing to do is to#includea header file with the required definition in the source file where you reference it, not to write a source file that will adapt itself to different possible sets of headers.As a hack, and depending on your environment and specific problem, the header file that does define
printf(or whatever function you care about) may also contain some preprocessor#defines that you could check for.