Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用使用,而不是定义或其他C++特征?_C++ - Fatal编程技术网

如何使用使用,而不是定义或其他C++特征?

如何使用使用,而不是定义或其他C++特征?,c++,C++,在我的代码中,我写了这样一行 #define THREAD_OUTPUT std::cout << "Thread " << thread_index << " - saved " << url << std::endl; 其中,thread_index是size_t,url是std::string 当然,它编译,但我希望它更像C++,因为我知道定义非常类似C,不推荐给一个好的C++代码。 这不是一个类型,所以没有基于使用的替代。您可

在我的代码中,我写了这样一行

#define THREAD_OUTPUT std::cout << "Thread " << thread_index << " - saved " << url << std::endl;
其中,thread_index是size_t,url是std::string


当然,它编译,但我希望它更像C++,因为我知道定义非常类似C,不推荐给一个好的C++代码。

这不是一个类型,所以没有基于使用的替代。您可以使用的是函数。以下是使用lambda的示例:

auto THREAD_OUTPUT = [&]() {
    std::cout
        << "Thread"
        << thread_index
        << " - saved "
        << url
        << std::endl;
};
考虑是否使用输出冲洗。
std::endl是必需的或有用的。不冲洗可能更有效

你是说,像一个函数

void ThreadOutput(const std::size_t thread_index, const std::string& url)
{
    std::cout << "Thread " << thread_index << " - saved " << url << std::endl;
}
我甚至想让它更一般一些:

void ThreadOutput(std::ostream& os, const std::size_t thread_index, const std::string& url)
{
    os << "Thread " << thread_index << " - saved " << url << std::endl;
}

// ThreadOutput(std::cout, 42, "https://lol.com");

同样在c语言中,这应该是一个函数而不是宏。宏不是真正的C风格,只是C++中的内容远远超过C语言,你可以用古代语言中的语言做一些事情,只有在宏观上才能清楚:定义有它的应用,就像其他任何东西一样,它可以被滥用和过度使用。我从来没有听说不建议在C++中使用它。你需要的时候就用它it@formerlyknownas_463035818我从来没有听说不建议在C++中使用它。真正地我经常听到。宏是邪恶的。不要使用宏。在C++中千万不要使用宏。我完全同意它们可以而且应该在某些情况下使用,但这也是最容易被滥用的机制,它可能会产生最疯狂的错误,这让它赢得了可怕的名声。一提到宏,许多程序员就会尖叫起来。@Yksisarvinen我对xy有点过敏,一般来说,xy是邪恶的。今天,C++中宏的使用完全有效。例如,请注意uu func_uuu仅包含在c++11的标准中!但是,使用宏有意义的情况很少。邪恶的东西是没有正当理由的盲目滥用宏,而真正邪恶的东西是使用太多的简化和泛化,只是为了得到一个每个人都能记住并虔诚地遵循的陈述,只是为了做好事side@Yksisarvinen实际上,我的评论是指“不推荐”的定义。我希望你同意定义头球后卫没有什么坏处。像OPs这样的语句让我相信,像宏这样的泛化是有害的,如果它们没有适当和详细的解释,那么它们弊大于利。实际上什么是恶,在什么情况下根本没有什么恶。它需要在与thread_index和url tho相同的范围内声明,并且在这两个定义之后宣布。我认为函数使用起来会更安全。@Yksisarvinen取决于用例。当需要时,命名函数可以更易于重用。如果从一个上下文中大量使用lambda,甚至可以将这两种方法结合起来,并使用lambda将参数绑定到函数。如果出现问题,则完全无法重现错误诊断的质量,从而导致死者在生者中行走。让它已经成为一个模板!更严重的是,东康斯特ftw!。也许函数应该有“内联”附加到它?防止ODR违规?@JVApen取决于你把它放在哪里。
void ThreadOutput(std::ostream& os, const std::size_t thread_index, const std::string& url)
{
    os << "Thread " << thread_index << " - saved " << url << std::endl;
}

// ThreadOutput(std::cout, 42, "https://lol.com");