簡體   English   中英

宏擴展和字符串化:如何使用另一個宏將字符串化的宏名稱(而不是其值)字符串化?

[英]Macro expansion and stringification: How to get the macro name (not its value) stringified using another macro?

不感興趣:

#define _ACD 5, 5, 5, 30

#define DEFAULT_NETWORK_TOKEN_KEY_CLASS   _ACD 

#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }

僅使用DEFAULT_NETWORK_TOKEN_KEY_CLASS宏,如何將_ACD字符串化為const unsigned char []。

const uint8 startMsg[] = ?? DEFAULT_NETWORK_TOKEN_KEY_CLASS ;

僅會產生_ACD

在這里獲得_ACD的正確宏擴展是什么? 如何將具有數組的宏字符串化為#define a_macro {5,7,7,97}的上下文中

(有關在沒有充分理由的情況下不濫用C預處理程序的標准免責聲明在此適用。)

當然可以做您想做的事。 您需要一個STRINGIFY宏和一些宏間接尋址。

通常, STRINGIFY是用一種間接級別定義的,以允許C預處理程序在對其進行字符串化之前擴展其參數。 一種實現是:

/* The # operator converts symbol 'v' into a string */
#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)

但是,您會發現這還不夠:

#define _ACD 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS   _ACD 
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS }

#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)
const char startMsg[] = START_MSG;

在這里, STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)擴展為STRINGIFY0(5,5,5,30) ,C預處理程序抱怨您給STRINGIFY0參數過多。

解決方案是延遲_ACD的擴展,以便僅在5,5,5,30時將其擴展為5,5,5,30 為此,請將其定義為類似於函數的宏:

#define _ACD() 5, 5, 5, 30

這樣, _ACD僅在您“調用”它時才被擴展: _ACD() DEFAULT_NETWORK_TOKEN_KEY_CLASS現在將擴展為_ACD ,您必須通過“調用”它進一步擴展它: DEFAULT_NETWORK_TOKEN_KEY_CLASS()

以下代碼說明了解決方案:

#include <stdio.h>

#define STRINGIFY0(v) #v
#define STRINGIFY(v) STRINGIFY0(v)

#define _ACD() 5, 5, 5, 30
#define DEFAULT_NETWORK_TOKEN_KEY_CLASS   _ACD 
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_CLASS() }

#define START_MSG STRINGIFY(DEFAULT_NETWORK_TOKEN_KEY_CLASS)

const char startMsg[] = START_MSG;

int main(int argc, char** argv)
{
  printf("%s\n",startMsg);
  return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM