<div dir="ltr"><div dir="ltr"><div dir="ltr">On Mon, Feb 4, 2019 at 3:26 PM Larry Evans via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">This godbolt example code:<br>
<br>
   <a href="https://godbolt.org/z/tiZ4jZ" rel="noreferrer" target="_blank">https://godbolt.org/z/tiZ4jZ</a><br>
<br>
shows that, depending on the value of #defined(TAG_CE),<br>
a global variable, i.e.:<br>
<br>
   tag_nc:<br>
         .zero   1<br>
<br>
is created.  Why can't the compiler see there's no need for this<br>
tag_nc global variable since the code behaves the same as when<br>
!defined(TAG_CE)?<br></blockquote><div><br></div><div>The cfe-dev mailing list doesn't seem like the appropriate place for this question; StackOverflow would be much better. [Moved the mailing list to BCC.]</div><div><br></div><div>A definition is required for variable `tag_nc` because you wrote a definition in your source code. The compiler needs to generate the symbol for that definition, so that you'll be able to link this object file with other object files that reference that symbol. For example, you might have another translation unit that contained this C++ code:</div><div><br></div><div>    extern tag_t tag_nc;</div><div>    void foo() { tag_t *p = &tag_nc; }</div><div><br></div><div>If you don't want `tag_nc` visible outside of the current translation unit, you should mark it `static` (or put it in an anonymous namespace), at which point the compiler will see that no symbol is required because `tag_nc` does not escape the translation unit.</div><div><a href="https://godbolt.org/z/yQdPEg">https://godbolt.org/z/yQdPEg</a></div><div><br></div><div>–Arthur</div></div></div></div>