FIX: Constructor C4705 Warning from Aggregate Class Member (98989)



The information in this article applies to:

  • Microsoft C/C++ for MS-DOS 7.0
  • Microsoft Visual C++ 1.0
  • Microsoft Visual C++ 1.5
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52
  • Microsoft Visual C++, 32-bit Professional Edition 2.0
  • Microsoft Visual C++, 32-bit Professional Edition 2.1

This article was previously published under Q98989

SYMPTOMS

When Microsoft C/C++ compiles an application, it generates the following message for each class constructor:
warning C4705: statement has no effect

CAUSE

The source code has an embedded aggregate member (class, struct, or union) in a class definition and the compiler command line includes the /W4 and /f- compiler options. Note that the /f- option is not supported in the Microsoft Visual C++ 32-bit compiler.

RESOLUTION

The C4705 warning is incorrect and can be safely ignored. If the embedded aggregate is a class, define a default constructor. This will supress the warning.

STATUS

Microsoft has confirmed this to be a bug in the products listed at the beginning of this article. This problem was fixed in Microsoft Visual C++, version 4.0.

MORE INFORMATION

The C4705 warning usually indicates a statement does not affect program execution. Each of the following statements causes this particular warning:
   num - 1270;
   count != 15;
   42;
				
The code example below demonstrates a structure data member that generates the C4705 warning for each class constructor. The warning also occurs if the example used a class or a union instead of a structure.

Sample Code

/* Compile options needed: /W4 /f- (Remove /f- for 32-bit compiler)
*/ 

#include <iostream.h>

struct MyStruct_tag { int i; };

class CMyClass {
   private:
      MyStruct_tag MyStruct;
   public:
      inline CMyClass() { MyStruct.i = 0; };

      inline CMyClass(int init) { MyStruct.i = init; };
      void Print(const char *);
};

void CMyClass::Print(const char* string)
{
   cout << string << MyStruct.i << endl;
}

void main(void)
{
   CMyClass Object1;
   CMyClass Object2(1024);

   Object1.Print("Object1.MyStruct.i = ");
   Object2.Print("Object2.MyStruct.i = ");
}
				

Modification Type:MinorLast Reviewed:7/5/2005
Keywords:kbbug kbCompiler kbCPPonly kbfix KB98989