www.digitalmars.com         C & C++   DMDScript  

c++ - design by contract

reply "Jim Jennings" <jwjenn mindspring.com> writes:
Is "design by contract implemented? I tried it with the following results:

// contr.cpp
#include <iostream>
#include <cassert>

using namespace std;  // just in case.
int main(int argc, char* argv[])
{
    __in
    {
         assert(argc == 3);
    }
    __body
    {
         std::cout<< "argv[1] == " << argv[1] << ", argv[2] == " << argv[2]
<< '\n';
    }
    return 1;
}

dmc contr -I\dm\stlport\stlport
    {
    ^
contr.cpp(9) : Error: undefined identifier '__stl_in'
    __body
         ^
contr.cpp(12) : Error: '=', ';' or ',' expected
    return 1;
         ^
contr.cpp(16) : Error: '=', ';' or ',' expected
}
^
contr.cpp(17) : Error: identifier or '( declarator )' expected
--- errorlevel 1
Mar 25 2003
parent reply "Walter" <walter digitalmars.com> writes:
It is implemented. Unfortunately, stl uses __in and __out as variable names,
which conflict with the keywords, so they are #defined to be __stl_in and
__stl_out. You can #undef __in and #undef __out after #including the stlport
files.

"Jim Jennings" <jwjenn mindspring.com> wrote in message
news:b5q3ih$1vmd$1 digitaldaemon.com...
 Is "design by contract implemented? I tried it with the following results:

 // contr.cpp
 #include <iostream>
 #include <cassert>

 using namespace std;  // just in case.
 int main(int argc, char* argv[])
 {
     __in
     {
          assert(argc == 3);
     }
     __body
     {
          std::cout<< "argv[1] == " << argv[1] << ", argv[2] == " <<
argv[2]
 << '\n';
     }
     return 1;
 }

 dmc contr -I\dm\stlport\stlport
     {
     ^
 contr.cpp(9) : Error: undefined identifier '__stl_in'
     __body
          ^
 contr.cpp(12) : Error: '=', ';' or ',' expected
     return 1;
          ^
 contr.cpp(16) : Error: '=', ';' or ',' expected
 }
 ^
 contr.cpp(17) : Error: identifier or '( declarator )' expected
 --- errorlevel 1
Mar 25 2003
parent reply "Jim Jennings" <jwjenn mindspring.com> writes:
"Walter" <walter digitalmars.com> wrote in message
news:b5q6hb$2211$1 digitaldaemon.com...
 It is implemented. Unfortunately, stl uses __in and __out as variable
names,
 which conflict with the keywords, so they are #defined to be __stl_in and
 __stl_out. You can #undef __in and #undef __out after #including the
stlport
 files.

 "Jim Jennings" <jwjenn mindspring.com> wrote in message
 news:b5q3ih$1vmd$1 digitaldaemon.com...
 Is "design by contract implemented?
Now I get this: (DBC is low priority, It looked simpler than all the "try ... catch" bloat) // contr.cpp #include <iostream> #include <cassert> #undef __in #undef __out using namespace std; // just in case. int main(int argc, char* argv[]) { __in { assert(argc == 3); } __body { std::cout<< "argv[1] == " << argv[1] << ", argv[2] == " << argv[2] << '\n'; } return 1; } dmc contr -I\dm\stlport\stlport __in ^ contr.cpp(9) : Error: '=', ';' or ',' expected __body ^ contr.cpp(13) : Error: '=', ';' or ',' expected } ^ contr.cpp(17) : Error: identifier or '( declarator )' expected return 1; ^ contr.cpp(18) : Error: '=', ';' or ',' expected } ^ contr.cpp(19) : Error: identifier or '( declarator )' expected Fatal error: too many errors --- errorlevel 1
Mar 25 2003
next sibling parent reply "Nic Tiger" <nictiger progtech.ru> writes:
Right syntax is:

----------------------------------
#include <iostream>
#include <cassert>
#undef __in
#undef __out

using namespace std;  // just in case.

int main(int argc, char* argv[])
__in
{
     assert(argc == 3);
}
__body
{
 std::cout<< "argv[1] == " << argv[1]
    << ", argv[2] == " << argv[2] << '\n';
 return 1;
}
----------------------------------------------
Note that __in, __out and __body sections follow right after function header
(not in {} braces).

And mention that you should specify -D switch (sc -D dbc.cpp). For me it
doesn't work with STL (linker issues errors about unresolved names).

Nic Tiger.

"Jim Jennings" <jwjenn mindspring.com> сообщил/сообщила в новостях
следующее: news:b5q96h$23sl$1 digitaldaemon.com...
 "Walter" <walter digitalmars.com> wrote in message
 news:b5q6hb$2211$1 digitaldaemon.com...
 It is implemented. Unfortunately, stl uses __in and __out as variable
names,
 which conflict with the keywords, so they are #defined to be __stl_in
and
 __stl_out. You can #undef __in and #undef __out after #including the
stlport
 files.

 "Jim Jennings" <jwjenn mindspring.com> wrote in message
 news:b5q3ih$1vmd$1 digitaldaemon.com...
 Is "design by contract implemented?
Now I get this: (DBC is low priority, It looked simpler than all the "try ... catch" bloat) // contr.cpp #include <iostream> #include <cassert> #undef __in #undef __out using namespace std; // just in case. int main(int argc, char* argv[]) { __in { assert(argc == 3); } __body { std::cout<< "argv[1] == " << argv[1] << ", argv[2] == " << argv[2] << '\n'; } return 1; } dmc contr -I\dm\stlport\stlport __in ^ contr.cpp(9) : Error: '=', ';' or ',' expected __body ^ contr.cpp(13) : Error: '=', ';' or ',' expected } ^ contr.cpp(17) : Error: identifier or '( declarator )' expected return 1; ^ contr.cpp(18) : Error: '=', ';' or ',' expected } ^ contr.cpp(19) : Error: identifier or '( declarator )' expected Fatal error: too many errors --- errorlevel 1
Mar 25 2003
parent "Jim Jennings" <jwjenn mindspring.com> writes:
Thank you, Walter and Nic, It works now.
Jim J.
P.S. I am positive that I tried that, and it complained about not having a
closing brace. I probably put a left brace in instead of a right brace.
careless!

"Nic Tiger" <nictiger progtech.ru> wrote in message
news:b5qf9c$28g6$1 digitaldaemon.com...
 Right syntax is:

 ----------------------------------
 #include <iostream>
 #include <cassert>
 #undef __in
 #undef __out

 using namespace std;  // just in case.

 int main(int argc, char* argv[])
 __in
 {
      assert(argc == 3);
 }
 __body
 {
  std::cout<< "argv[1] == " << argv[1]
     << ", argv[2] == " << argv[2] << '\n';
  return 1;
 }
 ----------------------------------------------
 Note that __in, __out and __body sections follow right after function
header
 (not in {} braces).

 And mention that you should specify -D switch (sc -D dbc.cpp). For me it
 doesn't work with STL (linker issues errors about unresolved names).

 Nic Tiger.

 "Jim Jennings" <jwjenn mindspring.com> сообщил/сообщила в новостях
 следующее: news:b5q96h$23sl$1 digitaldaemon.com...
 "Walter" <walter digitalmars.com> wrote in message
 news:b5q6hb$2211$1 digitaldaemon.com...
 It is implemented. Unfortunately, stl uses __in and __out as variable
names,
 which conflict with the keywords, so they are #defined to be __stl_in
and
 __stl_out. You can #undef __in and #undef __out after #including the
stlport
 files.

 "Jim Jennings" <jwjenn mindspring.com> wrote in message
 news:b5q3ih$1vmd$1 digitaldaemon.com...
 Is "design by contract implemented?
Now I get this: (DBC is low priority, It looked simpler than all the
"try
 ... catch" bloat)

 // contr.cpp
 #include <iostream>
 #include <cassert>
 #undef __in
 #undef __out
 using namespace std;  // just in case.
 int main(int argc, char* argv[])
 {
     __in
     {
          assert(argc == 3);
     }
     __body
     {
          std::cout<< "argv[1] == " << argv[1]
             << ", argv[2] == " << argv[2] << '\n';
     }
     return 1;
 }

 dmc contr -I\dm\stlport\stlport
     __in
        ^
 contr.cpp(9) : Error: '=', ';' or ',' expected
     __body
          ^
 contr.cpp(13) : Error: '=', ';' or ',' expected
     }
     ^
 contr.cpp(17) : Error: identifier or '( declarator )' expected
     return 1;
          ^
 contr.cpp(18) : Error: '=', ';' or ',' expected
 }
 ^
 contr.cpp(19) : Error: identifier or '( declarator )' expected
 Fatal error: too many errors
 --- errorlevel 1
Mar 25 2003
prev sibling parent "Walter" <walter digitalmars.com> writes:
Rewrite the function body as:

int main(int argc, char* argv[])
__in
{
         assert(argc == 3);
}
__body
{
         std::cout<< "argv[1] == " << argv[1]
            << ", argv[2] == " << argv[2] << '\n';
     return 1;
}


"Jim Jennings" <jwjenn mindspring.com> wrote in message
news:b5q96h$23sl$1 digitaldaemon.com...
 "Walter" <walter digitalmars.com> wrote in message
 news:b5q6hb$2211$1 digitaldaemon.com...
 It is implemented. Unfortunately, stl uses __in and __out as variable
names,
 which conflict with the keywords, so they are #defined to be __stl_in
and
 __stl_out. You can #undef __in and #undef __out after #including the
stlport
 files.

 "Jim Jennings" <jwjenn mindspring.com> wrote in message
 news:b5q3ih$1vmd$1 digitaldaemon.com...
 Is "design by contract implemented?
Now I get this: (DBC is low priority, It looked simpler than all the "try ... catch" bloat) // contr.cpp #include <iostream> #include <cassert> #undef __in #undef __out using namespace std; // just in case. int main(int argc, char* argv[]) { __in { assert(argc == 3); } __body { std::cout<< "argv[1] == " << argv[1] << ", argv[2] == " << argv[2] << '\n'; } return 1; } dmc contr -I\dm\stlport\stlport __in ^ contr.cpp(9) : Error: '=', ';' or ',' expected __body ^ contr.cpp(13) : Error: '=', ';' or ',' expected } ^ contr.cpp(17) : Error: identifier or '( declarator )' expected return 1; ^ contr.cpp(18) : Error: '=', ';' or ',' expected } ^ contr.cpp(19) : Error: identifier or '( declarator )' expected Fatal error: too many errors --- errorlevel 1
Mar 25 2003