【问题标题】:C++ preprocessor stringification that preserves newlines?保留换行符的 C++ 预处理器字符串化?
【发布时间】:2013-11-13 12:13:39
【问题描述】:

我需要记录(出于审计/日志记录目的)在我的代码中传递的 lambda 函数的代码。当然,lambda 对象也需要保存。于是我想出了一个宏解决方案如下:

#define LAMBDA_AND_STRING(lambda) lambda, #lambda

using namespace std;

int main(int argc, const char * argv[])
{
    auto p = pair<function<void()>, string> ( LAMBDA_AND_STRING( [] {
        cout << "Hello world!" << endl;
        cout << "Hello again!";
    } ) );

    cout << "CODE:" << endl << p.second << endl << endl;

    cout << "EXECUTION:" << endl;
    p.first();
    cout << endl;

}

这个输出:

CODE:
[] { cout << "Hello world!" << endl; cout << "Hello again!"; }

EXECUTION:
Hello world!
Hello again!

这几乎很好,但是 lambda 定义中的换行符消失了(实际上我的 lambdas 比上述原型示例中的要长得多,因此出于可读性的原因需要保留换行符)。关于如何保留它们的任何想法? (C++11 很好)。

谢谢!

【问题讨论】:

    标签: c++ c++11 c-preprocessor


    【解决方案1】:

    如果我没记错的话,新行甚至不是传递给宏的参数的一部分。这与空白折叠相对于宏扩展发生的顺序有关,实际上空白在预处理器标记化期间被剥离。

    foo.cpp:

    #define FOO(a) a
    
    FOO(
        one
        two
        three
    )
    

    结果:

    $ gcc -E foo.cpp
    # 1 "foo.cpp"
    # 1 "<command-line>"
    # 1 "foo.cpp"
    
    
    one two three
    

    所以我觉得你运气不好。你可以做一些真正讨厌的事情来解决它:

    #define LAMBDA_AND_STRING(lambda) lambda, #lambda
    #define NEWLINE
    
    LAMBDA_AND_STRING( [] { NEWLINE
        cout << "Hello world!" << endl; NEWLINE
        cout << "Hello again!"; NEWLINE
    } )
    

    预处理到:

    [] { cout << "Hello world!" << endl; cout << "Hello again!"; }, "[] { NEWLINE cout << \"Hello world!\" << endl; NEWLINE cout << \"Hello again!\"; NEWLINE }"
    

    现在在打印之前替换字符串中的NEWLINEs。

    【讨论】:

    • 使用;; 作为行分隔符怎么样?更短、更清晰,并且不影响原始来源,无需宏。
    • @tehinternetsismadeofcatz:它不会影响这个来源,尽管它会影响例如对具有多个详细参数的算法的调用,这些参数已被分成几行。
    • 我认为我实际上可以接受“讨厌”的解决方法。不必依赖它会更好,但是在这个项目上,正确的日志记录/审计是不可协商的。所以我唯一的选择是编写两次代码,这是维护的噩梦。
    • 哎哟。我需要我的宏扩展不删除换行符,以便保留 _LINE_。这似乎是不可能的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2011-10-22
    • 2019-06-21
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    相关资源
    最近更新 更多