<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[extern bei Funktionen doch nicht implizit?]]></title><description><![CDATA[<p>Hallo,<br />
gerade war ich ein bisschen verstutzt, als folgendes Konstrukt zu einem Linkerfehler mit nicht aufgelöstem externen Verweis führte (Compiler MSVC 10):</p>
<pre><code class="language-cpp">//foo.h
#ifndef FOO_H
#define FOO_H
namespace Foo {
    inline void foo();
}
#endif
</code></pre>
<pre><code class="language-cpp">//foo.cpp
#include &quot;foo.h&quot;
#include &lt;iostream&gt;

inline void Foo::foo() {
    std::cout &lt;&lt; &quot;FOO&quot; &lt;&lt; std::endl;
}
</code></pre>
<pre><code class="language-cpp">//main.cpp
#include &quot;foo.h&quot;

int main() {
    Foo::foo();
    return 0;
}
</code></pre>
<p>Wenn ich in der foo.h nun aber ein extern vor die Funktionsdeklaration setze funktioniert alles tadellos. Muss ich jetzt wirklich vor jeder globalen Funktion ein extern setzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/290510/extern-bei-funktionen-doch-nicht-implizit</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 12:35:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290510.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Jul 2011 21:55:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Wed, 27 Jul 2011 21:55:49 GMT]]></title><description><![CDATA[<p>Hallo,<br />
gerade war ich ein bisschen verstutzt, als folgendes Konstrukt zu einem Linkerfehler mit nicht aufgelöstem externen Verweis führte (Compiler MSVC 10):</p>
<pre><code class="language-cpp">//foo.h
#ifndef FOO_H
#define FOO_H
namespace Foo {
    inline void foo();
}
#endif
</code></pre>
<pre><code class="language-cpp">//foo.cpp
#include &quot;foo.h&quot;
#include &lt;iostream&gt;

inline void Foo::foo() {
    std::cout &lt;&lt; &quot;FOO&quot; &lt;&lt; std::endl;
}
</code></pre>
<pre><code class="language-cpp">//main.cpp
#include &quot;foo.h&quot;

int main() {
    Foo::foo();
    return 0;
}
</code></pre>
<p>Wenn ich in der foo.h nun aber ein extern vor die Funktionsdeklaration setze funktioniert alles tadellos. Muss ich jetzt wirklich vor jeder globalen Funktion ein extern setzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098763</guid><dc:creator><![CDATA[WeltbildZerstört]]></dc:creator><pubDate>Wed, 27 Jul 2011 21:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Wed, 27 Jul 2011 22:01:55 GMT]]></title><description><![CDATA[<p>Nein, aber Inline-Funktionen können prinzipbedingt keine externe Linkage haben. Mit <code>inline</code> muss die Funktion in der gleichen Übersetzungseinheit (d.h. in jeder .cpp-Datei, die deinen Header einbindet) definiert sein. Das läuft darauf hinaus, dass die Definition von Inline-Funktionen ebenfalls im Header stehen muss.</p>
<p>Lass also das Schlüsselwort weg, wenn du <code>extern</code> -Funktionen willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098764</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 27 Jul 2011 22:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Wed, 27 Jul 2011 22:19:40 GMT]]></title><description><![CDATA[<p>Ok, aber auch wenn ich das inline weglasse, kann der Compiler das mit der höchsten Optimierungsstufe doch trotzdem noch inlinen oder? Denn mit Klassenfunktionen funktioniert das ja auch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098765</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098765</guid><dc:creator><![CDATA[WeltbildZerstört]]></dc:creator><pubDate>Wed, 27 Jul 2011 22:19:40 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Thu, 28 Jul 2011 05:42:20 GMT]]></title><description><![CDATA[<p>Funktionen, die in anderen Übersetzungseinheiten definiert werden, kann kein Compiler inlinen. Auch nicht Klassenfunktionen. Wie soll er das auch machen, der Compiler kennt immer nur eine Übersetzungseinheit.</p>
<p>Das kann höchstens der Linker, bzw. eine Stufe zwischen Compiler und Linker (Stichwort Linktime Codegeneration bei Microsoft, bei GCC gibt es etwas ähnliches).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098806</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 28 Jul 2011 05:42:20 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Thu, 28 Jul 2011 08:33:55 GMT]]></title><description><![CDATA[<p>Es gibt nur wenige Stellen, wo es wirklich sinnvoll ist, das inline explizit auszuschreiben. Der Grund ist ganz grob gesagt, dass Compiler, Omtimizer und Linker eh machen, was sie wollen. Sie inlinen nicht jede Funktion, die als inline deklariert wird, weil sie es manchmal besser wissen, dass sich das inlinen eben nicht lohnt. Dafür inlinen sie viele Funktionen, die nicht explizit inline deklariert wurden, weil sich der Overhead für den Aufruf nicht lohnt.</p>
<p>Ich persönlich schreibe inline nur dann explizit hin, wenn ich eine nicht-template-Funktion im Header definieren möchte, weil ich entweder zu faul bin, für einen Einzeiler eine extra .cpp anzulegen, oder weil es sich um eine Header-Only Bibliothek handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098863</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 28 Jul 2011 08:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Thu, 28 Jul 2011 08:54:46 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Ich persönlich schreibe inline nur dann explizit hin, wenn ich eine nicht-template-Funktion im Header definieren möchte, weil ich entweder zu faul bin, für einen Einzeiler eine extra .cpp anzulegen, oder weil es sich um eine Header-Only Bibliothek handelt.</p>
</blockquote>
<p>Bin ich erleichtert, dass ich nicht der einzige bin, der das so macht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098867</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 28 Jul 2011 08:54:46 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Thu, 28 Jul 2011 09:04:14 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<p>Bin ich erleichtert, dass ich nicht der einzige bin, der das so macht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Wobei ich mir den Punkt &quot;Faulheit&quot; auszutreiben versuche. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> Meist handelt man sich früher oder später ja eh noch die eine oder andere weitere Zeile/Funktion ein, und spätestens wenn für die Funktionsdefinition weitere Header benötigt werden, hört bei mir der Spaß auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098868</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 28 Jul 2011 09:04:14 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Thu, 28 Jul 2011 12:20:32 GMT]]></title><description><![CDATA[<p>WeltbildZerstört schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//foo.h
#ifndef FOO_H
#define FOO_H
namespace Foo {
    inline void foo();
}
#endif
</code></pre>
</blockquote>
<p>Wenn Du das Ding irgendwo einbindest und foo verwendest, ohne dass in derselben die Implementierung bekannt ist, verletzt Du damit die ODR (one definition rule). Die ODR sagt, dass, falls eine inline-Funktion benutzt wird, sie in derselben Übersetzungsheinheit auch definiert sein muss. Die ODR sagt auch, dass inline-Funktionen sowie Funktions-Templates mehrfach definiert werden dürfen, sofern die Definitionen in unterschiedlichen ÜEs auftauchen. Du darfst also die inline-Funktion direkt im Header definieren/implementieren. Wenn Du das nicht möchtest, musst Du hier das inline wegnehmen.</p>
<p>WeltbildZerstört schrieb:</p>
<blockquote>
<p>Ok, aber auch wenn ich das inline weglasse, kann der Compiler das mit der höchsten Optimierungsstufe doch trotzdem noch inlinen oder?</p>
</blockquote>
<p>Eher nicht. Compiler arbeiten meistens ÜE-weise und wissen nicht, was in anderen ÜEs sonst noch steht. Eine solche Optimierung könnte man später beim Linken durchführen. So etwas gibt es auch schon und nennt sich LTO (link time optimization). Das können aber nicht viele und muss meistes extra eingeschaltet werden.</p>
<p>WeltbildZerstört schrieb:</p>
<blockquote>
<p>Denn mit Klassenfunktionen funktioniert das ja auch...</p>
</blockquote>
<p>Funktionen, die Du in einer Klassendefinition definierst sind automatisch inline. Denn sonst würdest Du wieder ODR-Verletzungen bekommen.</p>
<p>Schau in Deinem C++ Buch der Wahl nach zum Thema &quot;one definition rule&quot;.</p>
<p>ÜE = Übersetzungseinheit = quasi das, was der Präprozessor für eine *.cpp-Datei ausspuckt (nach includes, makro-ersetzung, etc)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2098975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098975</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 28 Jul 2011 12:20:32 GMT</pubDate></item><item><title><![CDATA[Reply to extern bei Funktionen doch nicht implizit? on Thu, 28 Jul 2011 12:41:17 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Die ODR sagt auch, dass inline-Funktionen sowie Funktions-Templates mehrfach definiert werden dürfen, sofern die Definitionen in unterschiedlichen ÜEs auftauchen.</p>
</blockquote>
<p>Wichtig ist hierbei noch zu erwähnen, dass die Definitionen in den verschiedenen ÜEs &quot;gleichwertig&quot; sein müssen.<br />
Gleichwertig heißt dabei, dass natürlich whitespaces verschieden gestaltet werden dürfen (sieht der Compiler eh nichts von), aber auch, dass z.B. Variablen andere Namen haben dürfen. Folgendes geht also durchaus:</p>
<pre><code class="language-cpp">//A.h
inline void foo(const int&amp; i);

//A.cpp
#include &lt;iostream&gt;
#include &quot;A.h&quot;
inline void foo(const int&amp; y)
{
  int z = 6;
  using std::cout;
  cout &lt;&lt; y*z &lt;&lt; '\n';
}

//main.cpp
#include &quot;A.h&quot;
#include &lt;iostream&gt;

#define LINEBREAK '\n'

void foo(const int&amp; myIntParam) {
  int other = 6;

  //just output the product
  std::cout &lt;&lt; (myIntParam*other)
       &lt;&lt; LINEBREAK;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2098990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2098990</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 28 Jul 2011 12:41:17 GMT</pubDate></item></channel></rss>