【问题标题】:Complicated multi-argument #define macro for strings字符串的复杂多参数#define 宏
【发布时间】:2011-10-24 08:07:28
【问题描述】:

我正在做一个项目,有一个我认为可以用宏解决的问题,但考虑到问题的性质,我没有经验自己写一个。

这是我期望的 #define 宏的输入和输出:

输入这样的代码

printf(foobar(Hello World.));

应该导致预处理器生成如下代码:

printf((char *)(std::string("")+'H'+'e'+'l'+'l'+'o'+' '+'W'+'o'+'r'+'l'+'d'+'.').c_str());

我假设这种复杂的事情是可能的,我希望你们中的一个可以帮助我。

我需要它是一个宏,我不想在任何地方使用字符串常量。

【问题讨论】:

  • 这基本上是一个“字符串常量”,除了终止的零(虽然你有一个用于“”)。你想达到什么目的,为什么要避免使用字符串常量?
  • 我不敢问在什么情况下这可能有意义......(你的实际要求是什么,让它产生特定的输出或在预处理器运行之前没有文字?)
  • 仅供参考 std::string()std::string("") 更好。你到底为什么要投给char*?我对人们所做的所有聪明事情感到惊讶,没有办法在宏中进行任何字符串操作。但真的,如果你不想听到这个,很抱歉,但最好避免使用宏。
  • 您不能,您将任意字符串放入宏中。您是否认为程序员可能使用hi:-) 而不是Hello World.hi:-) 中的右括号怎么样?
  • 预处理器并没有你想象的那么强大。不过,您可以使用单独的程序将您的 Hello World. 转换为您想要的格式。

标签: c++ string c-preprocessor


【解决方案1】:

我能想到的唯一解决方案是通过合适的脚本运行您的代码(可能只是一些简单的awk),在您的代码到达预编译器之前进行替换。

根据您的环境,您可以在 Visual Studio 中将其作为“预构建事件”执行,或者直接在您的 makefile 中添加一个步骤。

【讨论】:

  • 这实际上是我现在正在做的,因为它看起来不像预编译器能够做我需要的。
【解决方案2】:

呃,我担心这是不可能的(除非我什么都不知道)。 我相信没有宏可以将给定的输入标记(例如 Hello)拆分 成构建它的字符(H e l l o)

有一些尝试做这样的事情,但我担心这不是你所需要的:

C++: Can a macro expand "abc" into 'a', 'b', 'c'?


“更强大的预编译器”?

试试这个话题:Replacements for the C preprocessor

【讨论】:

  • 我需要更强大的预编译器 :(
  • @Nowayz 不,我很确定你需要一个更好的目标。
  • 目标的原因对于回答问题并不重要。
  • 不,但如果你解释为什么你想做一些看起来毫无用处的事情可能有助于找到更好/可能的解决方案
  • 我希望 a 能够在没有字符串常量的情况下使用字符串。
【解决方案3】:

宏基本上是字符串的替换或添加。 您可以使用自己的预处理器执行此操作,但标准预处理器不会将字符串拆分为组件。

这个怎么样: 将所有这些(假设有多个)“宏”放在一个单独的文件中。编写一个程序,将它们转换为您需要的扩展,然后在您的 c 程序中包含该文件?然后,您可以使扩展程序成为您的 make 文件的一部分,以便它始终是最新的。 使用单独的文件使扩展程序比解析 c/c++ 文件容易得多。

【讨论】:

  • 我仍然需要它能够即时工作,而无需完全为一个字符串修改或构建另一个函数。
【解决方案4】:

由于您正在为您的问题寻找一个狭隘、直接的答案并且没有任何建议,因此如下:

这是不可能的。无论您要达到什么目标,您都必须找到不同的解决方案。

【讨论】:

    【解决方案5】:

    你试过了吗:

    #define toString(x) #x
    

    你可以像这样使用它:

    printf("%s", toString(hello world));
    

    不要尝试直接对字符串使用 printf,因为字符串中可以有格式说明符。

    printf(toString(hello world)); //wrong, you can have for example %d in the string
    

    【讨论】:

    • 这创建了一个字符串常量,他明确地试图避免......无论出于何种原因
    • 不要听起来太模糊..如果没有任何字符串常量,您将找不到任何字符串常量。这不仅仅是一些正常的生产代码,我意识到这个问题很奇怪。
    • 如果你想要做的只是隐藏一些字符串,你可以简单地存储一个 char[] 与一些有趣的值异或的值
    • 这实际上是个好主意,但真的不是我要在这里拍摄的。
    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多