ES.34: Don't define a (C-style) variadic function
ES.34:不要定义C风格的可变参数函数
Reason(原因)
Not type safe. Requires messy cast-and-macro-laden code to get working right.
这种方式不是类型安全的。需要繁杂的类型转换和宏装载代码来保证正确动作。
Example(示例)
#include // "severity" followed by a zero-terminated list of char*s; write the C-style strings to cerrvoid error(int severity ...){ va_list ap; // a magic type for holding arguments va_start(ap, severity); // arg startup: "severity" is the first argument of error() for (;;) { // treat the next var as a char*; no checking: a cast in disguise char* p = va_arg(ap, char*); if (!p) break; cerr << p << ' '; } va_end(ap); // arg cleanup (don't forget this) cerr << ''; if (severity) exit(severity);}void use(){ error(7, "this", "is", "an", "error", nullptr); error(7); // crash error(7, "this", "is", "an", "error"); // crash const char* is = "is"; string an = "an"; error(7, "this", "is", an, "error"); // crash}
Alternative: Overloading. Templates. Variadic templates.
可选项:重载,模板,可变参数模板。
#include void error(int severity){ std::cerr << ''; std::exit(severity);}template constexpr void error(int severity, T head, Ts... tail){ std::cerr << head; error(severity, tail...);}void use(){ error(7); // No crash! error(5, "this", "is", "not", "an", "error"); // No crash! std::string an = "an"; error(7, "this", "is", "not", an, "error"); // No crash! error(5, "oh", "no", nullptr); // Compile error! No need for nullptr.}
Note(注意)
This is basically the way printf is implemented.
这是实现printf的基本方法。
Enforcement(实施建议)
- Flag definitions of C-style variadic functions.
- 标记定义了C风格可变参数函数的情况。
- Flag #include and #include
- 标记代码中包含#include 和 #include 的情况。
原文链接
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#-es34-dont-define-a-c-style-variadic-function
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!