blob: 5b6f97ebab5f01f8934148e97865f7a1c7bcd35a [file] [log] [blame]
<html lang="en">
<head>
<title>Static Definitions - Using the GNU Compiler Collection (GCC)</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="Using the GNU Compiler Collection (GCC)">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings" title="C++ Misunderstandings">
<link rel="next" href="Name-lookup.html#Name-lookup" title="Name lookup">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
2008 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Funding Free Software'', the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below). A copy of the license is included in the section entitled
``GNU Free Documentation License''.
(a) The FSF's Front-Cover Text is:
A GNU Manual
(b) The FSF's Back-Cover Text is:
You have freedom to copy and modify this GNU Manual, like GNU
software. Copies published by the Free Software Foundation raise
funds for GNU development.-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Static-Definitions"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Name-lookup.html#Name-lookup">Name lookup</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="C_002b_002b-Misunderstandings.html#C_002b_002b-Misunderstandings">C++ Misunderstandings</a>
<hr>
</div>
<h4 class="subsection">11.8.1 Declare <em>and</em> Define Static Members</h4>
<p><a name="index-C_002b_002b-static-data_002c-declaring-and-defining-3233"></a><a name="index-static-data-in-C_002b_002b_002c-declaring-and-defining-3234"></a><a name="index-declaring-static-data-in-C_002b_002b-3235"></a><a name="index-defining-static-data-in-C_002b_002b-3236"></a>When a class has static data members, it is not enough to <em>declare</em>
the static member; you must also <em>define</em> it. For example:
<pre class="smallexample"> class Foo
{
...
void method();
static int bar;
};
</pre>
<p>This declaration only establishes that the class <code>Foo</code> has an
<code>int</code> named <code>Foo::bar</code>, and a member function named
<code>Foo::method</code>. But you still need to define <em>both</em>
<code>method</code> and <code>bar</code> elsewhere. According to the ISO
standard, you must supply an initializer in one (and only one) source
file, such as:
<pre class="smallexample"> int Foo::bar = 0;
</pre>
<p>Other C++ compilers may not correctly implement the standard behavior.
As a result, when you switch to <samp><span class="command">g++</span></samp> from one of these compilers,
you may discover that a program that appeared to work correctly in fact
does not conform to the standard: <samp><span class="command">g++</span></samp> reports as undefined
symbols any static data members that lack definitions.
</body></html>