C(预处理器):如何连接/追加替换字符串

时间:2015-07-08 13:12:08

标签: c c-preprocessor

我在命令行上定义了我的异常:

String[] array = "LLSlotBook17-07-2015@Friday@1@10.00AM-12.00PM@10@LMV,mCWG".split(",|@");

我检查字符串:

-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; } ,它可以处理所有可能的异常排列。

换句话说,我想将一个字符串附加到宏变量 - 是否可能?

4 个答案:

答案 0 :(得分:1)

你可以拥有定义链,但它看起来不会更好:

#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

再一次,不是更好。

确实不应该定义开放if的宏。它允许奇怪的互动,例如if(cond) EXCEPTIONS1 else cout<<"error"; - 因为EXCEPTIONS1是普通的if并且会吞噬else分支而不会做你期望的事情。

使用代码块编写宏的典型方法是将整个内容包装在do{...}while(0)中(注意无结尾;)。

答案 1 :(得分:1)

签出令牌字符串化和连接部分here 这可能会有所帮助。通常,使用命令行宏来填充表并使用一个宏只是扩展为一个循环来检查该表的连续条目以设置except标志似乎更容易。

例如,将以下内容保存为silly.c并使用cc -DEX1 = \&#34; hello \&#34;

进行编译
#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;
}

只需添加更多&#34;块&#34;根据需要到桌子上。当然是一个建议。

答案 2 :(得分:0)

您可以将宏参数转换为字符串:

#define STR(x)    #x

STR(hello)  -->  "hello"

你可以通过将它们彼此相邻地连接起来来连接字符串文字

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

或创建一个宏:

#define CONCAT(a, b) a b

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

答案 3 :(得分:-1)

您可以使用##将字符串连接到宏。使用索引并仅使用条件来设置索引。然后在最后,您可以将索引与宏EXCEPTION连接起来。喜欢,

定义像#define append(name) name ## counter

这样的宏

如果name为1,这将为name1提供counter

现在,您可以在单个变量append

中定义不同的name