<p>I would like to do the equivalent of the following:</p>

<pre><code>#define print_max(TYPE) \
#  ifdef TYPE##_MAX \
     printf("%lld\n", TYPE##_MAX); \
#  endif

print_max(INT);
</code></pre>

<p>Now the <code>#ifdef</code> or any nested preprocessor directive is
not allowed as far as I can see in a function macro.
Any ideas?</p>

<p>Update: So it seems like this is not possible. Even a hack to check at runtime seems unachievable. So I think I'll go with something like:</p>

<pre><code>#ifndef BLAH_MAX
#  define BLAH_MAX 0
#endif
# etc... for each type I'm interested in

#define print_max(TYPE) \
    if (TYPE##_MAX) \
       printf("%lld\n", TYPE##_MAX);

print_max(INT);
print_max(BLAH);
</code></pre>

I don't think it's a case of the ## operator not being allowed in an #ifdef. I tried this:
```
```
#define _print_max(TYPE) \
#ifdef TYPE \
printf("%lld\n", _TYPE); \
#endif

#define print_max(TYPE) _print_max(MAX##_TYPE)

void main() 
{
    print_max(INT)
}
```
```
and it still didn't work (it didn't like #ifdef TYPE). The problem is that #ifdef will only accept #defined symbols, not #define arguments. Those are two different things.