【问题标题】:C/C++ preprocessor single quote? [duplicate]C/C++ 预处理器单引号? [复制]
【发布时间】:2010-11-30 19:30:08
【问题描述】:

可能重复:
How to single-quote an argument in a macro?

它如何做到以下几点:

#define MACRO(X) ...
MACRO(a) // should give 'a'

【问题讨论】:

    标签: c-preprocessor stringification


    【解决方案1】:

    我可能错过了一个更简单的方法,但是#define MACRO(X) ((#X)[0]) 怎么样。 #X 进行字符串化,然后[0] 选择第一个字符。

    【讨论】:

    • hmm,不幸的是我需要它来进行元编程,所以字符串不起作用
    • 这个问题的重复答案有一个可行的变体。
    【解决方案2】:

    似乎不能用 C 预处理器完成,至少gcc docs 直言不讳:

    没有办法转换宏 参数转换为字符常量。

    【讨论】:

      【解决方案3】:

      像这样:

      #include <string>
      
      std::string Macro(const std::string& s)
      {
        std::string ret = "'";
        ret += s;
        ret += "'";
        return ret;
      }
      

      编辑:

      在发现元编程需要这个答案之前,我发布了这个答案。我不知道如何为元编程实现这一点,但元编程不是我的专长。

      另外,至于我为什么首先有效地说“不要使用预处理器”,请阅读下面的 cmets。但简而言之,我相信几乎所有通常使用预处理器完成的事情都可以而且应该使用第一级构造来完成。使用预处理器绕过 C++ 类型系统并降低安全性。宏难以调试,难以扩展。大量使用宏将导致没有创建宏的程序员不熟悉的代码,从而导致一种只有一个人知道的“秘密语言”,不仅降低了宏的可维护性,还降低了它们所在的函数的可维护性被使用了。

      好的,我想这不是那么短,但确实如此。

      【讨论】:

      • 那不使用预处理器...
      • +1 用于引导 OP 远离预处理器
      • -1 表示完全没有回答问题;我讨厌当我问如何做 X 而答案是“不要做 X”。答案甚至不能与预处理器解决方案互换,您不能在用户想要使用MACRO 的地方拨打Macro 的电话,它甚至不会构建。这就像试图用std::string sum(std::string a, std::string b) {return a + "+" + b;}替换#define SUM(a, b) (a)+(b)
      • @John 你可能是对的,但这无关紧要。我认为 C++ 远远优于 PHP,但我不会用“首先切换到 C++,然后执行此操作”来回答 PHP 问题
      • @Michael:我明白你的观点并同意,我应该这么说。希望这些 cmets 能够澄清。对于它的价值,我通常会详细说明为什么我说“不要做 X”。有时相当多。
      猜你喜欢
      • 2019-05-13
      • 2011-01-01
      • 2011-10-04
      • 2014-02-26
      • 2010-09-07
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      相关资源
      最近更新 更多