summaryrefslogtreecommitdiff
path: root/apps/examples/elf/tests/hello++
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-10-25 20:06:46 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-10-25 20:06:46 +0000
commit5ae419f6845ff28bcbdb339cdfb66f6b2e46f9ab (patch)
tree871dcd80c04a5b65c613cbc80c92a83d7bbbbe46 /apps/examples/elf/tests/hello++
parent8cbc20e05c24cc3e2b0b4774f4850357b9f46595 (diff)
downloadpx4-nuttx-5ae419f6845ff28bcbdb339cdfb66f6b2e46f9ab.tar.gz
px4-nuttx-5ae419f6845ff28bcbdb339cdfb66f6b2e46f9ab.tar.bz2
px4-nuttx-5ae419f6845ff28bcbdb339cdfb66f6b2e46f9ab.zip
Add an example for testing the ELF loader
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5260 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'apps/examples/elf/tests/hello++')
-rw-r--r--apps/examples/elf/tests/hello++/Makefile116
-rw-r--r--apps/examples/elf/tests/hello++/hello++1.cpp60
-rw-r--r--apps/examples/elf/tests/hello++/hello++2.cpp123
-rw-r--r--apps/examples/elf/tests/hello++/hello++3.cpp132
-rw-r--r--apps/examples/elf/tests/hello++/hello++4.cpp150
5 files changed, 581 insertions, 0 deletions
diff --git a/apps/examples/elf/tests/hello++/Makefile b/apps/examples/elf/tests/hello++/Makefile
new file mode 100644
index 000000000..b3d07d262
--- /dev/null
+++ b/apps/examples/elf/tests/hello++/Makefile
@@ -0,0 +1,116 @@
+############################################################################
+# examples/elf/tests/hello/Makefile
+#
+# Copyright (C) 2012 Gregory Nutt. All rights reserved.
+# Author: Gregory Nutt <gnutt@nuttx.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+# 3. Neither the name NuttX nor the names of its contributors may be
+# used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+#
+############################################################################
+
+-include $(TOPDIR)/.config
+-include $(TOPDIR)/Make.defs
+
+BIN1 = hello++1
+BIN2 = hello++2
+BIN3 = hello++3
+#BIN4 = hello++4
+ALL_BIN = $(BIN1) $(BIN2) $(BIN3) $(BIN4)
+
+SRCS1 = $(BIN1).c
+OBJS1 = $(SRCS1:.c=.o)
+
+SRCS2 = $(BIN2).c
+OBJS2 = $(SRCS2:.c=.o)
+
+SRCS3 = $(BIN3).c
+OBJS3 = $(SRCS3:.c=.o)
+
+#SRCS4 = $(BIN4).c
+#OBJS4 = $(SRCS4:.c=.o)
+
+SRCS = $(SRCS1) $(SRCS2) $(SRCS3) $(SRCS4)
+OBJS = $(OBJS1) $(OBJS2) $(OBJS3) $(OBJS4)
+
+LIBSTDC_STUBS_DIR = $(TOPDIR)/libxx
+LIBSTDC_STUBS_LIB = $(LIBSTDC_STUBS_DIR)/liblibxx.a
+
+all: $(BIN1) $(BIN2) $(BIN3) $(BIN4)
+
+$(OBJS): %.o: %.cpp
+ @echo "CC: $<"
+ @$(CXX) -c $(CXXPICFLAGS) $< -o $@
+
+# This contains libstdc++ stubs to that you can build C++ code
+# without actually having libstdc++
+
+$(LIBSTDC_STUBS_LIB):
+ @$(MAKE) -C $(LIBSTDC_STUBS_DIR) TOPDIR=$(TOPDIR)
+
+# BIN1 and BIN2 link just like C code because they contain no
+# static constructors. BIN1 is equivalent to a C hello world;
+# BIN2 contains a class that implements hello world, but it is
+# not statically initialized.
+
+$(BIN1): $(OBJS1)
+ @echo "LD: $<"
+ @$(LD) $(LDELFFLAGS) -o $@ $^
+
+$(BIN2): $(OBJS2)
+ @echo "LD: $<"
+ @$(LD) $(LDELFFLAGS) -o $@ $^
+
+# BIN3 is equivalent to BIN2 except that is uses static initializers
+
+$(BIN3): $(OBJS3)
+ @echo "LD: $<"
+ @$(LD) $(LDELFFLAGS) -o $@ $^
+
+# BIN4 is similar to BIN3 except that it uses the streams code from libstdc++
+#
+# NOTE: libstdc++ is not available for NuttX as of this writing
+#
+#$(BIN4): $(OBJS4)
+# @echo "LD: $<"
+# @$(LD) $(LDELFFLAGS) -o $@ $^
+
+clean:
+ @rm -f $(ALL_BIN) *.o *~ .*.swp core
+
+install: $(ALL_BIN)
+ @install -D $(BIN1) $(ROMFS_DIR)/$(BIN1)
+ @install -D $(BIN2) $(ROMFS_DIR)/$(BIN2)
+ @install -D $(BIN3) $(ROMFS_DIR)/$(BIN3)
+# @install -D $(BIN4) $(ROMFS_DIR)/$(BIN4)
+
+
+
+
+
+
+
diff --git a/apps/examples/elf/tests/hello++/hello++1.cpp b/apps/examples/elf/tests/hello++/hello++1.cpp
new file mode 100644
index 000000000..22a728188
--- /dev/null
+++ b/apps/examples/elf/tests/hello++/hello++1.cpp
@@ -0,0 +1,60 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/elf/tests/hello++/hello++1.c
+//
+// Copyright (C) 2012 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <gnutt@nuttx.org>
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in
+// the documentation and/or other materials provided with the
+// distribution.
+// 3. Neither the name NuttX nor the names of its contributors may be
+// used to endorse or promote products derived from this software
+// without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an trivial version of "Hello, World" program. It illustrates
+// that we can build C programs using the C++ compiler.
+//
+// - Building a C++ program to use the C library
+// - No class creation
+// - NO Streams
+// - NO Static constructor and destructors
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ printf("Hello, World!\n");
+ return 0;
+}
diff --git a/apps/examples/elf/tests/hello++/hello++2.cpp b/apps/examples/elf/tests/hello++/hello++2.cpp
new file mode 100644
index 000000000..a8ba589bd
--- /dev/null
+++ b/apps/examples/elf/tests/hello++/hello++2.cpp
@@ -0,0 +1,123 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/elf/tests/hello++/hello++2.c
+//
+// Copyright (C) 2012 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <gnutt@nuttx.org>
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in
+// the documentation and/or other materials provided with the
+// distribution.
+// 3. Neither the name NuttX nor the names of its contributors may be
+// used to endorse or promote products derived from this software
+// without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an another trivial version of "Hello, World" design. It illustrates
+//
+// - Building a C++ program to use the C library
+// - Basic class creation
+// - NO Streams
+// - NO Static constructor and destructors
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+
+/////////////////////////////////////////////////////////////////////////////
+// Classes
+/////////////////////////////////////////////////////////////////////////////
+
+class CThingSayer
+{
+ const char *szWhatToSay;
+public:
+ CThingSayer(void)
+ {
+ printf("CThingSayer::CThingSayer: I am!\n");
+ szWhatToSay = (const char*)NULL;
+ }
+
+ ~CThingSayer(void)
+ {
+ printf("CThingSayer::~CThingSayer: I cease to be\n");
+ if (szWhatToSay)
+ {
+ printf("CThingSayer::~CThingSayer: I will never say '%s' again\n",
+ szWhatToSay);
+ }
+ szWhatToSay = (const char*)NULL;
+ }
+
+ void Initialize(const char *czSayThis)
+ {
+ printf("CThingSayer::Initialize: When told, I will say '%s'\n",
+ czSayThis);
+ szWhatToSay = czSayThis;
+ }
+
+ void SayThing(void)
+ {
+ printf("CThingSayer::SayThing: I am now saying '%s'\n", szWhatToSay);
+ }
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ CThingSayer *MyThingSayer;
+
+ printf("main: Started. Creating MyThingSayer\n");
+
+ // Create an instance of the CThingSayer class
+ // We should see the message from constructor, CThingSayer::CThingSayer(),
+
+ MyThingSayer = new CThingSayer;
+ printf("main: Created MyThingSayer=0x%08lx\n", (long)MyThingSayer);
+
+ // Tell MyThingSayer that "Hello, World!" is the string to be said
+
+ printf("main: Calling MyThingSayer->Initialize\n");;
+ MyThingSayer->Initialize("Hello, World!");
+
+ // Tell MyThingSayer to say the thing we told it to say
+
+ printf("main: Calling MyThingSayer->SayThing\n");;
+ MyThingSayer->SayThing();
+
+ // We should see the message from the destructor,
+ // CThingSayer::~CThingSayer(), AFTER we see the following
+
+ printf("main: Destroying MyThingSayer\n");
+ delete MyThingSayer;
+
+ printf("main: Returning\n");;
+ return 0;
+}
diff --git a/apps/examples/elf/tests/hello++/hello++3.cpp b/apps/examples/elf/tests/hello++/hello++3.cpp
new file mode 100644
index 000000000..eedaa6df0
--- /dev/null
+++ b/apps/examples/elf/tests/hello++/hello++3.cpp
@@ -0,0 +1,132 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/elf/tests/hello++/hello++3.c
+//
+// Copyright (C) 2012 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <gnutt@nuttx.org>
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in
+// the documentation and/or other materials provided with the
+// distribution.
+// 3. Neither the name NuttX nor the names of its contributors may be
+// used to endorse or promote products derived from this software
+// without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an another trivial version of "Hello, World" design. It illustrates
+//
+// - Building a C++ program to use the C library and stdio
+// - Basic class creation with virtual methods.
+// - Static constructor and destructors (in main program only)
+// - NO Streams
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+
+/////////////////////////////////////////////////////////////////////////////
+// Classes
+/////////////////////////////////////////////////////////////////////////////
+
+class CThingSayer
+{
+ const char *szWhatToSay;
+public:
+ CThingSayer(void);
+ virtual ~CThingSayer(void);
+ virtual void Initialize(const char *czSayThis);
+ virtual void SayThing(void);
+};
+
+// A static instance of the CThingSayer class. This instance MUST
+// be constructed by the system BEFORE the program is started at
+// main() and must be destructed by the system AFTER the main()
+// returns to the system
+
+static CThingSayer MyThingSayer;
+
+// These are implementations of the methods of the CThingSayer class
+
+CThingSayer::CThingSayer(void)
+{
+ printf("CThingSayer::CThingSayer: I am!\n");
+ szWhatToSay = (const char*)NULL;
+}
+
+CThingSayer::~CThingSayer(void)
+{
+ printf("CThingSayer::~CThingSayer: I cease to be\n");
+ if (szWhatToSay)
+ {
+ printf("CThingSayer::~CThingSayer: I will never say '%s' again\n",
+ szWhatToSay);
+ }
+ szWhatToSay = (const char*)NULL;
+}
+
+void CThingSayer::Initialize(const char *czSayThis)
+{
+ printf("CThingSayer::Initialize: When told, I will say '%s'\n",
+ czSayThis);
+ szWhatToSay = czSayThis;
+}
+
+void CThingSayer::SayThing(void)
+{
+ printf("CThingSayer::SayThing: I am now saying '%s'\n", szWhatToSay);
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ // We should see the message from constructor, CThingSayer::CThingSayer(),
+ // BEFORE we see the following messages. That is proof that the
+ // C++ static initializer is working
+
+ printf("main: Started. MyThingSayer should already exist\n");
+
+ // Tell MyThingSayer that "Hello, World!" is the string to be said
+
+ printf("main: Calling MyThingSayer.Initialize\n");;
+ MyThingSayer.Initialize("Hello, World!");
+
+ // Tell MyThingSayer to say the thing we told it to say
+
+ printf("main: Calling MyThingSayer.SayThing\n");;
+ MyThingSayer.SayThing();
+
+ // We are finished, return. We should see the message from the
+ // destructor, CThingSayer::~CThingSayer(), AFTER we see the following
+ // message. That is proof that the C++ static destructor logic
+ // is working
+
+ printf("main: Returning. MyThingSayer should be destroyed\n");;
+ return 0;
+}
diff --git a/apps/examples/elf/tests/hello++/hello++4.cpp b/apps/examples/elf/tests/hello++/hello++4.cpp
new file mode 100644
index 000000000..1a9f2e28b
--- /dev/null
+++ b/apps/examples/elf/tests/hello++/hello++4.cpp
@@ -0,0 +1,150 @@
+/////////////////////////////////////////////////////////////////////////////
+// examples/elf/tests/hello++/hello++4.c
+//
+// Copyright (C) 2012 Gregory Nutt. All rights reserved.
+// Author: Gregory Nutt <gnutt@nuttx.org>
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+//
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in
+// the documentation and/or other materials provided with the
+// distribution.
+// 3. Neither the name NuttX nor the names of its contributors may be
+// used to endorse or promote products derived from this software
+// without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+// FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+// COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+// OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+/////////////////////////////////////////////////////////////////////////////
+//
+// This is an excessively complex version of "Hello, World" design to
+// illustrate some basic properties of C++:
+//
+// - Building a C++ program
+// - Streams / statically linked libstdc++
+// - Static constructor and destructors (in main program only)
+//
+/////////////////////////////////////////////////////////////////////////////
+
+/////////////////////////////////////////////////////////////////////////////
+// Included Files
+/////////////////////////////////////////////////////////////////////////////
+
+#include <cstdio>
+#include <iostream>
+
+#ifndef NULL
+# define NULL ((void*)0L)
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// Classes
+/////////////////////////////////////////////////////////////////////////////
+
+using namespace std;
+
+// A hello world sayer class
+
+class CThingSayer
+{
+ const char *szWhatToSay;
+public:
+ CThingSayer(void);
+ virtual ~CThingSayer(void);
+ virtual void Initialize(const char *czSayThis);
+ virtual void SayThing(void);
+};
+
+/////////////////////////////////////////////////////////////////////////////
+// Private Data
+/////////////////////////////////////////////////////////////////////////////
+
+// A static instance of the CThingSayer class. This instance MUST
+// be constructed by the system BEFORE the program is started at
+// main() and must be destructed by the system AFTER the main()
+// returns to the system
+
+static CThingSayer MyThingSayer;
+
+/////////////////////////////////////////////////////////////////////////////
+// Method Implementations
+/////////////////////////////////////////////////////////////////////////////
+
+// These are implementations of the methods of the CThingSayer class
+
+CThingSayer::CThingSayer(void)
+{
+ cout << "CThingSayer::CThingSayer: I am!" << endl;
+ szWhatToSay = (const char*)NULL;
+}
+
+CThingSayer::~CThingSayer(void)
+{
+ cout << "CThingSayer::~CThingSayer: I cease to be" << endl;
+ if (szWhatToSay)
+ {
+ cout << "CThingSayer::~CThingSayer: I will never say '"
+ << szWhatToSay << "' again" << endl;
+ }
+ szWhatToSay = (const char*)NULL;
+}
+
+void CThingSayer::Initialize(const char *czSayThis)
+{
+ cout << "CThingSayer::Initialize: When told, I will say '"
+ << czSayThis << "'" << endl;
+ szWhatToSay = czSayThis;
+}
+
+void CThingSayer::SayThing(void)
+{
+ cout << "CThingSayer::SayThing: I am now saying '"
+ << szWhatToSay << "'" << endl;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// Public Functions
+/////////////////////////////////////////////////////////////////////////////
+
+int main(int argc, char **argv)
+{
+ // We should see the message from constructor, CThingSayer::CThingSayer(),
+ // BEFORE we see the following messages. That is proof that the
+ // C++ static initializer is working
+
+ cout << "main: Started" << endl;
+
+ // Tell MyThingSayer that "Hello, World!" is the string to be said
+
+ cout << "main: Calling MyThingSayer.Initialize" << endl;
+ MyThingSayer.Initialize("Hello, World!");
+
+ // Tell MyThingSayer to say the thing we told it to say
+
+ cout << "main: Calling MyThingSayer.SayThing" << endl;
+ MyThingSayer.SayThing();
+
+ // We are finished, return. We should see the message from the
+ // destructor, CThingSayer::~CThingSayer(), AFTER we see the following
+ // message. That is proof that the C++ static destructor logic
+ // is working
+
+ cout << "main: Returning" << endl;
+ return 0;
+}