代码之家  ›  专栏  ›  技术社区  ›  Maleev

C++宏:操作参数(具体示例)

  •  5
  • Maleev  · 技术社区  · 16 年前

    GET("any_name")
    

    具有

    String str_any_name = getFunction("any_name");
    

    3 回复  |  直到 10 年前
        1
  •  26
  •   Macke    11 年前

    怎么样:

    #define UNSAFE_GET(X) String str_##X = getFunction(#X);
    

    或者,为了安全防范嵌套宏问题:

    #define STRINGIFY2(x) #x
    #define STRINGIFY(x) STRINGIFY2(x)
    #define PASTE2(a, b) a##b
    #define PASTE(a, b) PASTE2(a, b)
    
    #define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));
    

    用法:

    SAFE_GET(foo)
    

    这就是编译的内容:

    String str_foo = getFunction("foo");
    

    • 以及#对宏参数进行字符串化(在C/C++中进行“反射”时非常有用)
    • 为宏使用前缀,因为它们都在同一个“命名空间”中,并且您不希望与任何其他代码发生冲突。(我根据您的用户名选择了MLV)
        2
  •  2
  •   anon anon    16 年前

    一种方法是在调用宏时不引用名称:

    #include <stdio.h>
    
    #define GET( name ) \
        int int##name = getFunction( #name );   \
    
    
    int getFunction( char * name ) {
        printf( "name is %s\n", name );
        return 42;
    }
    
    int main() {
        GET( foobar );
    }
    
        3
  •  2
  •   j_random_hacker    16 年前

    回答你的问题,不,你不能“剥掉”C++中的引文。但正如其他答案所示,您可以“添加它们”。因为您始终使用字符串文字(对吗?),所以您应该能够切换到新方法。