November 04, 2001
Sorry for the length of the post... ;)  I hope at least Walter will read it!  There are some bugs, or at least different behavior of DMC than standard says (BCC and GCC compile those samples without any problems, for instance).

Bug #1
------------

// file: test1.cpp
#include <iostream.h>

class Test
{
public:
    Test(double a): x(a) {}
    double operator()(double b) { return x + b; }
private:
    double x;
};

int main()
{
    for (double v = 0.0; v < 1.0; v += 0.1)
    {
        cout << "Test: " << Test(v)(2.0) << endl;
    }
    return 0;
}

sc -c test1.cpp

        cout << "Test: " << Test(v)(2.0) << endl;
                                   ^
test1.cpp(16) : Error: illegal operand types
Had: void *
--- errorlevel 1

If I add a dummy constructor argument to Test, like:

Test(double a, double):x(a) {}
// ... same stuff here...
 for (double v = 0.0; v < 1.0; v += 0.1)
    {
        cout << "Test: " << Test(v, 3.0)(2.0) << endl;
    }

everything works fine.  As workaround for a single arg, we can declare a temp variable:

for(double v = 0.0; v < 1.0; v += 0.1)
{
  Test aux(v);
  cout << aux(2.0) << endl;
}

Bug #2
-----------------------

// cst.h
#ifndef __CST_H__
#define __CST_H__
extern const char hello[];
#endif

// cst.cpp
extern const char hello[] = "Hello, DMC!!";

// test2.cpp
#include "cst.h"
#include <iostream.h>

int main()
{
  cout << hello << endl;
  return 0;
}

sc -otest2.exe test2.cpp cst.cpp
test2.cpp:
cst.cpp:
link test2+cst,test2.exe,,user32+kernel32/noi;
OPTLINK (R) for Win32  Release 7.50B1
Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved

test2.obj(test2)
 Error 42: Symbol Undefined ?hello@@3QBDB (const char const
*const hello)

--- errorlevel 1

Workaround: use extern "C" instead of plain extern.  BTW, isn't there a const too many?  const char hello[] should be equivalent with 'const char * const hello', right?

Bug #3
---------------

Well, mostly wishlist: correct scoping of variables declared in for loops, like in "for (unsigned i = 0; i < 3; i++) {}"... there should be no more i visible after for.  Maybe Walter could do this easily (eventually Borland style, with a command line switch, not to ruin compatibility with old code).

And also for Walter: the difference between <stdio.h> and
<cstdio>, or any other old "C" headers and new method in ANSI-C++,
is that C's standard functions are put into namespace std,
intead of the global namespace.  DMC doesn't do this, unfortunately.
 How about using the gcc 2.95.x method of considering
namespace std an alias of the global namespace, unless told otherwise
(with -fhonor-std).

These are probably easy to do, and will save some of us from a
lot of editing of ANSI-C++ code, for making it compilable with
DMC.  Also, iostreams headers without trailing '.h' would be nice... :)


Regards,
  Laurentiu Pancescu
November 05, 2001
Thanks!

"Laurentiu Pancescu" <plaur@crosswinds.net> wrote in message news:9s4aor$9jv$1@digitaldaemon.com...
> Sorry for the length of the post... ;)  I hope at least Walter will read it!  There are some bugs, or at least different behavior of DMC than standard says (BCC and GCC compile those samples without any problems, for instance).
>
> Bug #1
> ------------
>
> // file: test1.cpp
> #include <iostream.h>
>
> class Test
> {
> public:
>     Test(double a): x(a) {}
>     double operator()(double b) { return x + b; }
> private:
>     double x;
> };
>
> int main()
> {
>     for (double v = 0.0; v < 1.0; v += 0.1)
>     {
>         cout << "Test: " << Test(v)(2.0) << endl;
>     }
>     return 0;
> }
>
> sc -c test1.cpp
>
>         cout << "Test: " << Test(v)(2.0) << endl;
>                                    ^
> test1.cpp(16) : Error: illegal operand types
> Had: void *
> --- errorlevel 1
>
> If I add a dummy constructor argument to Test, like:
>
> Test(double a, double):x(a) {}
> // ... same stuff here...
>  for (double v = 0.0; v < 1.0; v += 0.1)
>     {
>         cout << "Test: " << Test(v, 3.0)(2.0) << endl;
>     }
>
> everything works fine.  As workaround for a single arg, we can declare a temp variable:
>
> for(double v = 0.0; v < 1.0; v += 0.1)
> {
>   Test aux(v);
>   cout << aux(2.0) << endl;
> }
>
> Bug #2
> -----------------------
>
> // cst.h
> #ifndef __CST_H__
> #define __CST_H__
> extern const char hello[];
> #endif
>
> // cst.cpp
> extern const char hello[] = "Hello, DMC!!";
>
> // test2.cpp
> #include "cst.h"
> #include <iostream.h>
>
> int main()
> {
>   cout << hello << endl;
>   return 0;
> }
>
> sc -otest2.exe test2.cpp cst.cpp
> test2.cpp:
> cst.cpp:
> link test2+cst,test2.exe,,user32+kernel32/noi;
> OPTLINK (R) for Win32  Release 7.50B1
> Copyright (C) Digital Mars 1989 - 2001  All Rights Reserved
>
> test2.obj(test2)
>  Error 42: Symbol Undefined ?hello@@3QBDB (const char const
> *const hello)
>
> --- errorlevel 1
>
> Workaround: use extern "C" instead of plain extern.  BTW, isn't there a const too many?  const char hello[] should be equivalent with 'const char * const hello', right?
>
> Bug #3
> ---------------
>
> Well, mostly wishlist: correct scoping of variables declared in for loops, like in "for (unsigned i = 0; i < 3; i++) {}"... there should be no more i visible after for.  Maybe Walter could do this easily (eventually Borland style, with a command line switch, not to ruin compatibility with old code).
>
> And also for Walter: the difference between <stdio.h> and
> <cstdio>, or any other old "C" headers and new method in ANSI-C++,
> is that C's standard functions are put into namespace std,
> intead of the global namespace.  DMC doesn't do this, unfortunately.
>  How about using the gcc 2.95.x method of considering
> namespace std an alias of the global namespace, unless told otherwise
> (with -fhonor-std).
>
> These are probably easy to do, and will save some of us from a
> lot of editing of ANSI-C++ code, for making it compilable with
> DMC.  Also, iostreams headers without trailing '.h' would be nice... :)
>
>
> Regards,
>   Laurentiu Pancescu