What does an empty # mean in a macro definition?












12















I have the following macro:



#define F(Args, ...) 
// macro definition
#
F(()) // looks like usage?
#undef F


What does the line containing only # mean? Is F(()) a usage of the macro?










share|improve this question





























    12















    I have the following macro:



    #define F(Args, ...) 
    // macro definition
    #
    F(()) // looks like usage?
    #undef F


    What does the line containing only # mean? Is F(()) a usage of the macro?










    share|improve this question



























      12












      12








      12


      1






      I have the following macro:



      #define F(Args, ...) 
      // macro definition
      #
      F(()) // looks like usage?
      #undef F


      What does the line containing only # mean? Is F(()) a usage of the macro?










      share|improve this question
















      I have the following macro:



      #define F(Args, ...) 
      // macro definition
      #
      F(()) // looks like usage?
      #undef F


      What does the line containing only # mean? Is F(()) a usage of the macro?







      c++ c macros






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Feb 2 at 14:02









      Boann

      37.3k1290121




      37.3k1290121










      asked Feb 2 at 10:03









      embedcembedc

      35910




      35910
























          1 Answer
          1






          active

          oldest

          votes


















          18














          Technically, that's not part of the macro (no continuation line before it).
          It's a directive that comes after the #define directive.



          # on its own line is called a null directive and it does nothing (as good as a comment).



          It's no longer practically useful (except as a visual marker) but in prehistoric C, the preprocessor only got invoked if a C source file started with a directive and the null directive placed at the very beginning of a C file was a good way to make sure the file was preprocessed (i.e., that later directives worked) without starting with a concrete directive.






          share|improve this answer


























          • I suppose it can be used to obfuscade code even further

            – Stack Danny
            Feb 2 at 12:01











          • @StackDanny Yeah, it could be seen as unnecessarily obfuscating.

            – PSkocik
            Feb 2 at 12:08






          • 2





            I knew that preprocessing was not always an automatic part of C compilation, but I didn't know that this was how the preprocessor was engaged. Nice.

            – John Bollinger
            Feb 2 at 14:54











          Your Answer






          StackExchange.ifUsing("editor", function () {
          StackExchange.using("externalEditor", function () {
          StackExchange.using("snippets", function () {
          StackExchange.snippets.init();
          });
          });
          }, "code-snippets");

          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "1"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54491941%2fwhat-does-an-empty-mean-in-a-macro-definition%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          1 Answer
          1






          active

          oldest

          votes








          1 Answer
          1






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          18














          Technically, that's not part of the macro (no continuation line before it).
          It's a directive that comes after the #define directive.



          # on its own line is called a null directive and it does nothing (as good as a comment).



          It's no longer practically useful (except as a visual marker) but in prehistoric C, the preprocessor only got invoked if a C source file started with a directive and the null directive placed at the very beginning of a C file was a good way to make sure the file was preprocessed (i.e., that later directives worked) without starting with a concrete directive.






          share|improve this answer


























          • I suppose it can be used to obfuscade code even further

            – Stack Danny
            Feb 2 at 12:01











          • @StackDanny Yeah, it could be seen as unnecessarily obfuscating.

            – PSkocik
            Feb 2 at 12:08






          • 2





            I knew that preprocessing was not always an automatic part of C compilation, but I didn't know that this was how the preprocessor was engaged. Nice.

            – John Bollinger
            Feb 2 at 14:54
















          18














          Technically, that's not part of the macro (no continuation line before it).
          It's a directive that comes after the #define directive.



          # on its own line is called a null directive and it does nothing (as good as a comment).



          It's no longer practically useful (except as a visual marker) but in prehistoric C, the preprocessor only got invoked if a C source file started with a directive and the null directive placed at the very beginning of a C file was a good way to make sure the file was preprocessed (i.e., that later directives worked) without starting with a concrete directive.






          share|improve this answer


























          • I suppose it can be used to obfuscade code even further

            – Stack Danny
            Feb 2 at 12:01











          • @StackDanny Yeah, it could be seen as unnecessarily obfuscating.

            – PSkocik
            Feb 2 at 12:08






          • 2





            I knew that preprocessing was not always an automatic part of C compilation, but I didn't know that this was how the preprocessor was engaged. Nice.

            – John Bollinger
            Feb 2 at 14:54














          18












          18








          18







          Technically, that's not part of the macro (no continuation line before it).
          It's a directive that comes after the #define directive.



          # on its own line is called a null directive and it does nothing (as good as a comment).



          It's no longer practically useful (except as a visual marker) but in prehistoric C, the preprocessor only got invoked if a C source file started with a directive and the null directive placed at the very beginning of a C file was a good way to make sure the file was preprocessed (i.e., that later directives worked) without starting with a concrete directive.






          share|improve this answer















          Technically, that's not part of the macro (no continuation line before it).
          It's a directive that comes after the #define directive.



          # on its own line is called a null directive and it does nothing (as good as a comment).



          It's no longer practically useful (except as a visual marker) but in prehistoric C, the preprocessor only got invoked if a C source file started with a directive and the null directive placed at the very beginning of a C file was a good way to make sure the file was preprocessed (i.e., that later directives worked) without starting with a concrete directive.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Feb 2 at 10:22

























          answered Feb 2 at 10:10









          PSkocikPSkocik

          34.5k65578




          34.5k65578













          • I suppose it can be used to obfuscade code even further

            – Stack Danny
            Feb 2 at 12:01











          • @StackDanny Yeah, it could be seen as unnecessarily obfuscating.

            – PSkocik
            Feb 2 at 12:08






          • 2





            I knew that preprocessing was not always an automatic part of C compilation, but I didn't know that this was how the preprocessor was engaged. Nice.

            – John Bollinger
            Feb 2 at 14:54



















          • I suppose it can be used to obfuscade code even further

            – Stack Danny
            Feb 2 at 12:01











          • @StackDanny Yeah, it could be seen as unnecessarily obfuscating.

            – PSkocik
            Feb 2 at 12:08






          • 2





            I knew that preprocessing was not always an automatic part of C compilation, but I didn't know that this was how the preprocessor was engaged. Nice.

            – John Bollinger
            Feb 2 at 14:54

















          I suppose it can be used to obfuscade code even further

          – Stack Danny
          Feb 2 at 12:01





          I suppose it can be used to obfuscade code even further

          – Stack Danny
          Feb 2 at 12:01













          @StackDanny Yeah, it could be seen as unnecessarily obfuscating.

          – PSkocik
          Feb 2 at 12:08





          @StackDanny Yeah, it could be seen as unnecessarily obfuscating.

          – PSkocik
          Feb 2 at 12:08




          2




          2





          I knew that preprocessing was not always an automatic part of C compilation, but I didn't know that this was how the preprocessor was engaged. Nice.

          – John Bollinger
          Feb 2 at 14:54





          I knew that preprocessing was not always an automatic part of C compilation, but I didn't know that this was how the preprocessor was engaged. Nice.

          – John Bollinger
          Feb 2 at 14:54




















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Stack Overflow!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54491941%2fwhat-does-an-empty-mean-in-a-macro-definition%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          Human spaceflight

          Can not write log (Is /dev/pts mounted?) - openpty in Ubuntu-on-Windows?

          張江高科駅