3

I'm not finding a lot of examples/documentation for the non-REPL world of C/C++ in Emacs org-mode babel. For example, is there a way to break a program up into separate source code blocks, i.e., a block for main, then separate blocks for its func1, func2, ... called by main? Or, is there any way to have just a stand-alone function lonefunc in a block, then call it from another place? I suppose this is all a form of literate programming, but typically you're pulling it all together with tangling. I'd like not to tangle, but have things running in the org-mode session.

  • For languages such as C and C++, there is no direct support of sessions. You'd have to embed in other block types to mimic them as @dfeich has shown in a separate answer below. – Emacs User Feb 10 '17 at 14:35
1

You can do this by using the noweb reference syntax:

First we define some named code blocks

#+NAME: srcMyfunc
#+BEGIN_SRC C 
  void myfunc() {
    printf("print from function\n");
  }
#+END_SRC  


#+NAME: srcMain
#+BEGIN_SRC C
  int main(int argc,char **argv) {
    printf("Hello World\n");
    myfunc();
    exit(0);
  }
#+END_SRC

Now we define a block which includes the other code blocks by referencing them with the <> syntax (needs the :noweb yes option). We could tangle this block, but we can also execute it directly.

#+BEGIN_SRC C :results output :noweb yes
  #include "stdlib.h"
  #include "stdio.h"

  <<srcMyfunc>>
  <<srcMain>>

  #+END_SRC

#+RESULTS:
: Hello World
: print from function

I prefer to do it in the way that I have one code block for combining all the others, because the <> tend to mess up the language buffer, except when I just want to test an isolated function.

I do not think that this is very useful for bigger programs, but I used it extensively in a parallel programming course to write notes and documentation.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.