宏可以从参数中删除字符吗?

时间:2016-05-20 19:35:35

标签: c string replace macros c-preprocessor

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

例如:

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

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

宏可以修剪掉最后一个字符'T'吗?

4 个答案:

答案 0 :(得分:5)

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

#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"
}

依赖于令牌粘贴运算符##来构造扩展为截断文本(或实际上是替换文本)的宏的名称,以及字符串化运算符{{1} },将展开的结果转换为字符串文字。还有一些必要的宏间接,以确保执行所有需要的扩展。

答案 1 :(得分:0)

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

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

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

不,你不能使用预处理器剥离字符而不使用实际的C代码(比如malloc + strncpy)来做到这一点。

答案 2 :(得分:0)

对于cpp:

#include <string>
#include <iostream>
#include <string.h>

#define REMOVE_LAST_CHAR(charPtr) std::string(charPtr).erase(strlen(charPtr) - 1,1)
#define MAKE_OBJECT_T_INTO_STRING(Variable) REMOVE_LAST_CHAR(#Variable)

struct ObjectT
{};

int main()
{

    std::cout << MAKE_OBJECT_T_INTO_STRING(ObjectT);
}

答案 3 :(得分:-2)

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

未经过测试的代码

#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"
}