Can I write C++ code without headers (repetitive function declarations)?

前端 未结 24 715
半阙折子戏
半阙折子戏 2020-11-28 07:55

Is there any way to not have to write function declarations twice (headers) and still retain the same scalability in compiling, clarity in debugging, and flexibility in desi

相关标签:
24条回答
  • 2020-11-28 08:26

    To offer a variant on the popular answer of rix0rrr:

    // foo.cph
    
    #define INCLUDEMODE
    #include "foo.cph"
    #include "other.cph"
    #undef INCLUDEMODE
    
    void foo()
    #if !defined(INCLUDEMODE)
    {
       printf("Hello World!\n");
    }
    #else
    ;
    #endif
    
    void bar()
    #if !defined(INCLUDEMODE)
    {
        foo();
    }
    #else
    ;
    #endif
    

    I do not recommend this, bit I think this construction demonstrates the removal of content repetition at the cost of rote repetition. I guess it makes copy-pasta easier? That's not really a virtue.

    As with all the other tricks of this nature, a modification to the body of a function will still require recompilation of all files including the file containing that function. Very careful automated tools can partially avoid this, but they would still have to parse the source file to check, and be carefully constructed to not rewrite their output if it's no different.

    For other readers: I spent a few minutes trying to figure out include guards in this format, but didn't come up with anything good. Comments?

    0 讨论(0)
  • 2020-11-28 08:28

    Use Lzz. It takes a single file and automatically creates a .h and .cpp for you with all the declarations/definitions in the right place.

    Lzz is really very powerful, and handles 99% of full C++ syntax, including templates, specializations etc etc etc.

    Update 150120:

    Newer C++ '11/14 syntax can only be used within Lzz function bodies.

    0 讨论(0)
  • 2020-11-28 08:28

    Nobody has mentioned Visual-Assist X under Visual Studio 2012 yet.

    It has a bunch of menus and hotkeys that you can use to ease the pain of maintaining headers:

    • "Create Declaration" copies the function declaration from the current function into the .hpp file.
    • "Refactor..Change signature" allows you to simultaneously update the .cpp and .h file with one command.
    • Alt-O allows you to instantly flip between .cpp and .h file.
    0 讨论(0)
  • 2020-11-28 08:32

    For practical purposes no, it's not possible. Technically, yes, you can. But, frankly, it's an abuse of the language, and you should adapt to the language. Or move to something like C#.

    0 讨论(0)
  • 2020-11-28 08:34

    In his article Simple Support for Design by Contract in C++, Pedro Guerreiro stated:

    Usually, a C++ class comes in two files: the header file and the definition file. Where should we write the assertions: in the header file, because assertions are specification? Or in the definition file, since they are executable? Or in both, running the risk of inconsistency (and duplicating work)? We recommend, instead, that we forsake the traditional style, and do away with the definition file, using only the header file, as if all functions were defined inline, very much like Java and Eiffel do.

    This is such a drastic change from the C++ normality that it risks killing the endeavor at the outset. On the other hand, maintaining two files for each class is so awkward, that sooner or later a C++ development environment will come up that hides that from us, allowing us to concentrate on our classes, without having to worry about where they are stored.

    That was 2001. I agreed. It is 2009 now and still no "development environment that hides that from us, allowing us to concentrate on our classes" has come up. Instead, long compile times are the norm.


    Note: The link above seems to be dead now. This is the full reference to the publication, as it appears in the Publications section of the author's website:

    Pedro Guerreiro, Simple Support for Design by Contract in C++, TOOLS USA 2001, Proceedings, pages 24-34, IEEE, 2001.

    0 讨论(0)
  • 2020-11-28 08:34

    Can I write C++ code without headers

    Read more about C++, e.g. the Programming using C++ book then the C+11 standard n3337.

    Yes, because the preprocessor is (conceptually) generating code without headers.

    If your C++ compiler is GCC and you are compiling your translation unit foo.cc consider running g++ -O -Wall -Wextra -C -E foo.cc > foo.ii; the emitted file foo.ii does not contain any preprocessor directive, and could be compiled with g++ -O foo.ii -o foo-bin into a foo-bin executable (at least on Linux). See also Advanced Linux Programming

    On Linux, the following C++ file

    // file ex.cc
    extern "C" long write(int fd, const void *buf, size_t count);
    extern "C" long strlen(const char*);
    extern "C" void perror(const char*);
    int main (int argc, char**argv)
    {
       if (argc>1) 
         write(1, argv[1], strlen(argv[1]);
       else 
         write(1, __FILE__ " has no argument",
                  sizeof(__FILE__ " has no argument"));
       if (write(1, "\n", 1) <= 0) {
         perror(__FILE__);
         return 1;
       }
       return 0;
    }
    

    could be compiled using GCC as g++ ex.cc -O ex-bin into an executable ex-bin which, when executed, would show something.

    In some cases, it is worthwhile to generate some C++ code with another program

    (perhaps SWIG, ANTLR, Bison, RefPerSys, GPP, or your own C++ code generator) and configure your build automation tool (e.g. ninja-build or GNU make) to handle such a situation. Notice that the source code of GCC 10 has a dozen of C++ code generators.

    With GCC, you might sometimes consider writing your own GCC plugin to analyze your (or others) C++ code (e.g. at the GIMPLE level). See also (in fall 2020) CHARIOT and DECODER European projects. You could also consider using the Clang static analyzer or Frama-C++.

    0 讨论(0)
提交回复
热议问题