有没有办法禁止在c样式变量参数列表中使用值?

Ole*_*ann 6 c c++

在c样式无类型变量参数列表中使用类的常规用法是常见的错误源.例:

class MyString {
    public:
    char *pChars;
    int Length;

    MyString(char *pChars) {
        this->pChars = pChars; 
        Length = strlen(pChars); 
        } };

int main() {
    MyString s1("Bla1"), s2("Bla2");
    printf("%s%s", s1, s2); // This does not but should give a compiler warning/error!
    return 0; }
Run Code Online (Sandbox Code Playgroud)

printf调用按值接收两个s对象.这意味着他们的所有成员都只是简单的内存复制.但它们被解释为一个简单的char指针.结果当然是运行时错误.

我不是要求解决这个问题,但是我希望有一些东西可以添加到我的类中,以便编译器警告我或者给出错误.

已经尝试声明但没有实现复制构造函数.但似乎没有调用复制构造函数.:-(

请回答标题中的问题.我不需要讨论为什么你不应该使用printf或这些变量参数列表 - 知道这一点.

谢谢你的时间.

qrd*_*rdl 11

体面编译器(如gcc)检查printf参数是否与格式字符串中的格式说明符匹配.

只是不要忘记添加-Wformat-Wall命令行选项.

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

  • 那么,也许Visual C++不是下降编译器? (4认同)
  • @kaptnole他们推迟了正派,至少关于你遇到的问题:) http://connect.microsoft.com/VisualStudio/feedback/details/98899/compiler-should-warn-about-passing-objects-of - 非POD类型到最省略号.我知道你不想听到这个,但不要使用printf看到这里的建议http://stackoverflow.com/questions/2017489/should-i-use-printf-in-my-c-code (2认同)