[英]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";
-不會達到您的期望,因為EXCEPTIONS1
是if
並且將吞噬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,這將依次為您name
為name1
現在,您可以定義不同的append
宏,以將結果與單個變量name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.