how come #include "*.cpp" works?

Hammond, Robin-David%KB3IEN muaddib@databit7.com
Thu May 11 19:17:00 GMT 2006


It looks like you have included one file two times. Thus upon the second 
include your are redefining that which has definition. Anytime you do 
that, the compiler must stop you, even if the redefinition matches the 
existing one.



On Thu, 11 May 2006, Klaas Thoelen wrote:

> Date: Thu, 11 May 2006 21:09:33 +0200
> From: Klaas Thoelen <klaas.thoelen@telenet.be>
> To: cygwin@cygwin.com
> Subject: how come #include "*.cpp" works?
> 
> Hello *,
>
> I recently installed cygwin to freshen up my C/C++, what I didn't want to do 
> using huge programs like visual studio. It seemed to work fine until I came 
> across the following problem.
>
> I have 3 files:     datum.h
>                        datum.cpp
>                        datumprint.cpp (which has my main in it)
>
> In 'datum.cpp' I include 'datum.h' as I should, and in 'datumprint.cpp' also. 
> But this gives me compile-errors about members of my class Date being 
> undefined. However, if I include 'datum.cpp' in 'datumprint.cpp' it works 
> just fine!
>
> This seems a little strange to me. Does anybody know what's wrong here?
>
> Thanks and regards,
> Klaas Thoelen
>
>
>
> datum.h
> ******
> class Date {
> public:
>   Date();
>   Date(int dd, int mm, int yy);
>   int day();
>   int month();
>   int year();
>   static void set_default(int, int, int);
>   Date& add_year(int);
>   Date& add_month(int);
>   Date& add_day(int);
>   Date& print();
> private:
>   int d, m, y;
>   static Date default_date;
>   static bool is_leapyear(int);
>   static int daysinmonth(int, int);
> };
>
>
> datum.cpp
> ********
> #include "datum.h"
> #include <iostream>
> #include <assert.h>
> using namespace std;
>
> Date Date::default_date(27, 4, 2006);
>
> Date::Date() {
>   d = default_date.d;
>   m = default_date.m;
>   y = default_date.y;
> }
>
> Date::Date(int dd, int mm, int yy) {
>   assert ( !(dd < 1) && !(dd > daysinmonth(mm, yy)) && !(mm < 1) && !(mm > 
> 12) );
>
>   d = dd;
>   m = mm;
>   y = yy;
> }
>
> void Date::set_default(int dd, int mm, int yy) {
>   assert ( !(dd < 1) && !(dd > daysinmonth(mm, yy)) && !(mm < 1) && !(mm > 
> 12) );
>     default_date.d = dd;
>   default_date.m = mm;
>   default_date.y = yy;
> }
>
> int Date::day() {
>   return d;
> }
>
> int Date::month() {
>   return m;
> }
>
> int Date::year() {
>   return y;
> }
>
> Date& Date::add_year(int yy) {
>   y = y + yy;
>     if ( d == 29 && m == 2 && !is_leapyear(y) ) {
>       d = 1;
>       m = 3;
>   }
>   return *this;
> }
>
> Date& Date::add_month(int mm) {
>   m = m + mm;
>
>   while (m > 12) {
>       m = m - 12;
>       y++;
>   }
>
>   if ( d == 29 && m == 2 && !is_leapyear(y) ) {
>       d = 1;
>       m = 3;
>   }
>
>   if ( d > daysinmonth(m, y)) {
>       d = d - daysinmonth(m, y);
>           m++;
>   }
>
>   return *this;
> }
>
> Date& Date::add_day(int dd) {
>   d = d + dd;
>     while (d > daysinmonth(m, y)) {
>       if (m == 12) {
>           y++;
>           d = d - daysinmonth(m, y);
>           m = 1;
>       } else {                                  d = d - daysinmonth(m, y);
>           m++;
>       }
>   }
>   return *this;
> }
>
> Date& Date::print() {
>   cout << d << "/" << m << "/" << y << "\n";
>   return *this;
> } 
> bool Date::is_leapyear(int yy) {
>   if (( !(yy % 4) && (yy % 100)) || !(yy % 400)) {
>       return true;
>   }
>   return false;
> }
>
> int Date::daysinmonth(int mm, int yy) {
>   if ( (mm == 2) && is_leapyear(yy) ) {
>       return 29;
>   } else{          int nr_days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 
> 31, 30, 31};
>       return nr_days[mm-1];
>   }
> }
>
> datumprint.cpp
> ***********
>
> #include "datum.h"         /***********the problem*************/
> #include <iostream>
>
> using namespace std;
>
> void print(Date x) {
>   cout << x.day() << "/" << x.month() << "/" << x.year() << "\n";
> }
>
> int main() {
>   Date::set_default(2, 12, 2007);
>   Date x;
>   print(x);
>   x.add_day(365);
>   print(x);
>
>   Date y(22, 12, 1999);
>   y.add_day(70);
>   print(y);
>
>   Date z(29, 2, 1896);
>   z.add_year(4);
>   print(z);
>
>   Date r(29, 2, 1896);
>   r.add_month(24);
>   print(r);
>
>   Date s(31, 05, 1896);
>   s.add_month(25);
>   print(s);
>
>   return 0;
> }
>


Some people are born mediocre, some people achieve mediocrity, and some
people have mediocrity thrust upon them.
                 -- Joseph Heller, "Catch-22"



Robin-David Hammond	KB3IEN
 	www.aresnyc.org.

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list