簡體   English   中英

C(預處理器):如何連接/附加替換字符串

[英]C (Preprocessor): How to concatenate/append substitution string

我在命令行上定義了例外:

-DEXCEPTION_1=\"first\" -DEXCEPTION_2=\"second\" -DEXCEPTION_3=\"third\"

我檢查一個字符串:

except = 0;
#ifdef EXCEPTION_1
if (! strcmp(EXCEPTION_1, mystring))
{  except = 1;
}
#endif
#ifdef EXCEPTION_2
if (! strcmp(EXCEPTION_2, mystring))
{  except = 1;
}
#endif
#ifdef EXCEPTION_3
if (! strcmp(EXCEPTION_3, mystring))
{  except = 1;
}
#endif
if (except == 1)
{  // do something
}
else
{  // do something else
}

不用說,盡管這有效,但它也很丑陋,不靈活,並導致代碼冗余。

有沒有辦法將字符串附加到預處理器宏變量?

我想得到這樣的東西(問題當然是#append不存在):

#ifdef EXCEPTION_1 #append EXCEPTIONS if (! strcmp(EXCEPTION_1, mystring)) {  except = 1; }
#ifdef EXCEPTION_2 #append EXCEPTIONS if (! strcmp(EXCEPTION_2, mystring)) {  except = 1; }
#ifdef EXCEPTION_3 #append EXCEPTIONS if (! strcmp(EXCEPTION_3, mystring)) {  except = 1; }

然后,我可以在代碼中使用EXCEPTIONS ,它將與異常的所有可能排列一起使用。

換句話說,我想在宏變量后附加一個字符串-可以嗎?

您可以具有定義鏈,但看起來不會更好:

#ifdef EXCEPTION_1 
#define EXCEPTIONS1 if (! strcmp(EXCEPTION_1, mystring)) {  except = 1; }
#else
#define EXCEPTIONS1
#endif

#ifdef EXCEPTION_2
#define EXCEPTIONS2 EXCEPTIONS1 if (! strcmp(EXCEPTION_2, mystring)) {  except = 1; }
#else
#define EXCEPTIONS2 EXCEPTIONS1 
#endif

// etc

再次,並沒有更好。

而且,您實際上不應該使用open if定義宏。 它允許諸如if(cond) EXCEPTIONS1 else cout<<"error"; -不會達到您的期望,因為EXCEPTIONS1if並且將吞噬else分支的平原。

用代碼塊編寫宏的典型方法是將整個內容包裝在do{...}while(0) (請注意沒有結尾; )。

此處簽出令牌字符串化和串聯部分這可能會有所幫助。 通常,使用命令行宏填充表似乎很容易,並且可以使用宏將其簡單擴展為一個循環,該循環檢查該表的后續條目以設置except標志。

例如,將以下內容另存為silly.c並使用cc -DEX1 = \\“ hello \\”進行編譯

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct Except {
   const char* key;
   int flag;
};

struct Except table[] = {
#if defined(EX1)
   {EX1,1},
#endif
   {NULL,0}
};

#define CHECKEX(mys,rv)  { rv = 0;for(int i=0;table[i].key!=0;i++)      \
         if (strcmp(table[i].key,(mys))==0) \
            rv = 1; \
   }

int main()
{
   int rv;
   CHECKEX("hello",rv);
   if (rv)
      printf("Got an hello\n");
   else printf("Got nothing\n");
   return 0;
}

只需根據需要向表中添加更多“塊”。 當然只是一個建議。

您可以將宏參數轉換為字符串:

#define STR(x)    #x

STR(hello)  -->  "hello"

您可以通過將字符串文字彼此相鄰地寫入來連接它們:

"123" "abc"  -->  "123abc"

或創建一個宏:

#define CONCAT(a, b) a b

CONCAT("hello", " world!")  --> "hello world!"

您可以使用##將字符串連接到宏。 使用索引,並且僅使用條件來設置索引。 然后,最后可以將索引與宏EXCEPTION 喜歡,

定義一個宏,例如#define append(name) name ## counter

如果counter為1,這將依次為您namename1

現在,您可以定義不同的append宏,以將結果與單個變量name

暫無
暫無

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

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