C預處理器宏是否可以包含預處理器指令?


Answers

我以前試過 問題是已經保留#來宏化參數。 它不會被解析為像#define那樣的預處理器標記。

Question

我想做相當於以下幾點:

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

print_max(INT);

現在#ifdef或任何嵌套的預處理器指令是不允許的,只要我可以在函數宏中看到。 有任何想法嗎?

更新:所以這似乎是不可能的。 即使在運行時檢查,似乎也無法實現。 所以我想我會像這樣的東西:

#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);



我不認為這是##運算符不允許在#ifdef中的情況。 我試過這個:

#define _print_max(TYPE) \
#ifdef TYPE \
printf("%lld\n", _TYPE); \
#endif

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


void main() 
{
    print_max(INT)
}

它仍然沒有工作(它不喜歡#ifdef類型)。 問題是#ifdef將只接受#defined的符號,而不是#define參數。 那是兩回事。




有沒有簡單的方法來做到這一點。 最接近你可以來#define大量的IFDEF宏,如:

#undef IFDEF_INT_MAX
#ifdef INT_MAX
#define IFDEF_INT_MAX(X)  X
#else
#define IFDEF_INT_MAX(X)
#endif

#undef IFDEF_BLAH_MAX
#ifdef BLAH_MAX
#define IFDEF_BLAH_MAX(X)  X
#else
#define IFDEF_BLAH_MAX(X)
#endif

     :

因為你需要很多這樣的東西(而且它們可能在多個地方有用),所以把它們放在自己的頭文件“ifdefs.h”中是很有意義的,只要你需要它們就可以包含它們。 你甚至可以編寫一個腳本,從“感興趣的宏”列表中重新生成ifdef.h

然後,你的代碼變成了

#include "ifdefs.h"
#define print_max(TYPE) \
IFDEF_##TYPE##_MAX( printf("%lld\n", TYPE##_MAX); )

print_max(INT);
print_max(BLAH);