C++ __VA_ARGS_uuuu,这个代码段是否可移植?

C++ __VA_ARGS_uuuu,这个代码段是否可移植?,c++,C++,这个代码段是可移植的吗 定义: #define log(...) std::cout << __FILE__ << "[" << __LINE__ << "]:" \ << string_format(__VA_ARGS__) \ << std::endl << std::flush string

这个代码段是可移植的吗

定义:

#define log(...)  std::cout << __FILE__ << "[" << __LINE__  << "]:" \
                            << string_format(__VA_ARGS__) \
                            << std::endl << std::flush

string_格式是sprintf,它输出一个std::string,这个std::string可以在我的gcc 4.6.3中使用,但我不想以后在其他编译器中出现编译问题。

是的,宏
\uu VA_ARGS\uuuuu
是标准C++的一部分:

C++11§16.3.1参数替换 替换列表中出现的标识符应视为参数,变量参数应构成用于替换它的预处理标记


是的,宏
是标准C++的一部分:

C++11§16.3.1参数替换 替换列表中出现的标识符应视为参数,变量参数应构成用于替换它的预处理标记


在大多数情况下,它相当便携。它是C++11语言标准(以及C99)的一部分,因此大多数现代编译器都支持它。对于只支持C++03的旧编译器,您可能会遇到问题。

在大多数情况下,它是非常可移植的。它是C++11语言标准(以及C99)的一部分,因此大多数现代编译器都支持它。对于只支持C++03的旧编译器,您可能会遇到问题。

移植它并找出原因。您没有通过经验测试来确定可移植性,这是正确的。但是为什么要将日志消息打印到
cout
而不是
clog
?并且
endl
已经执行了刷新。什么是阻塞?endl flush是标准的一部分还是编译器的一部分?移植它并找出答案。你们并没有通过经验测试来确定可移植性。但是为什么要将日志消息打印到
cout
而不是
clog
?并且
endl
已经执行了刷新。什么是阻塞?endl flush是标准的一部分还是编译器的一部分?
log("i = %d", i);