【问题标题】:Can a macro remove characters from its arguments?宏可以从其参数中删除字符吗?
【发布时间】:2016-09-18 04:25:51
【问题描述】:

是否可以定义一个宏来修剪传入的字符串参数的一部分?

例如:

//can this be defined?  
#define MACRO(o) ???

int main(){
   printf(MACRO(ObjectT)); //prints "Object" not "ObjectT"
}

是否可以使用一个宏来修剪最后一个字符“T”?

【问题讨论】:

  • 写一个do...while,计算strlen并打印到strlen-2...但是太宽泛了...
  • #define ObjectT "Object", #define MACRO(o) o....
  • 没有办法做你想做的事。您可以将字符附加到标识符,但不能删除它们。

标签: c string replace macros c-preprocessor


【解决方案1】:

您可以对预先知道的特定字符串执行此操作,将其作为符号而不是字符串文字呈现给宏,但不适用于一般符号,也根本不适用于字符串文字。例如:

#include <stdio.h>

#define STRINGIFY(s) # s
#define EXPAND_TO_STRING(x) STRINGIFY(x)
#define TRUNCATE_ObjectT Object
#define TRUNCATE_MrT Pity da fool
#define TRUNCATE(s) EXPAND_TO_STRING(TRUNCATE_ ## s)

int main(){
   printf(TRUNCATE(ObjectT)); // prints "Object"
   printf(TRUNCATE(MrT));     // prints "Pity da fool"
}

这依赖于标记粘贴运算符 ## 来构造扩展为截断文本(或者实际上是替换文本)的宏的名称,以及字符串化运算符 # 来转换扩展结果为字符串文字。那里也有一点必要的宏间接,以确保执行所有需要的扩展。

【讨论】:

    【解决方案2】:

    好吧,至少它应该打印“对象”...

    //can this be defined?  
    #define MACRO(o) #o "\b \b"
    
    int main(){
        printf(MACRO(ObjectT)); //prints "Object" not "ObjectT"
    }
    

    不,你不能在没有实际 C 代码(比如 malloc+strncpy)的情况下使用预处理器来剥离字符。

    【讨论】:

      【解决方案3】:

      使用预处理器?不。听起来你真正想做的是这样的:

      代码未测试

      #define STRINGIFY(o) #o
      
      char* serialize(char* s)
      {
        if (strcmp(s, "ObjectT") == 0) return "Object";
      }
      
      int main(){
         printf(serialize(STRINGIFY(#o))); //prints "Object" not "ObjectT"
      }
      

      【讨论】:

      • 如果你这样做,是什么阻止你的serialize 只是为了砍掉角色?
      • @EugeneSh。如果你愿意,当然可以这样做,但我正在对 OP 的实际问题进行有根据的猜测。这真的值得投反对票吗?
      • 不是我的 DV,但这并不能回答问题:如果回答错误,请不要原谅自己:编写、测试和演示的代码并不复杂。
      • 如果你真的在乎,我不是反对者。但另一方面,我有根据地猜测 OP 知道如何在运行时执行此操作。
      • @WeatherVane 答案是“你不能用预处理器做到这一点”,然后是“这是一个解决方法”。我确实测试了代码,但将警告放在那里,因为如此迂腐地为显然不是真实的代码进行演示是愚蠢的。
      猜你喜欢
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2015-03-01
      • 2010-09-25
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2012-04-23
      相关资源
      最近更新 更多