Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

I'm looking for a good resource for learning about good API design for C++ libraries, looking at shared objects/dlls etc. There are many resources on writing nice APIs, nice classes, templates and so on at source level, but barely anything about putting things together in shared libs and executables. Books like Large-Scale C++ Software Design by John Lakos are interesting but massively outdated.

What I'm looking for is advice i.e. on handling templates. With templates in my API I often end up with library code in my executable (or other library) so if I fix a bug in there I can't simply roll out the new library but have to recompile and redistribute all clients of that code. (and yes, I know some solutions like trying to instantiate at least the most common versions inside the library etc.)

I'm also looking for other caveats and things to mind for keeping binary compatibility while working on C++ libraries.

Is there a good website or book on such things?

share|improve this question
    
I handled it this way: sivut.koti.soon.fi/~terop/GameApi.html -- i.e. while there are templates inside the lib, none of it is in the api... –  tp1 Sep 2 '12 at 14:36
    
DeadMG: Well, that's the kind of quality you can get if you work hard for few years. Once you have better example, please tell us where it is. While you'll think it's not good quality, my claim is just that making better one takes more effort than you'd think. –  tp1 Sep 2 '12 at 15:43
    
It's the kind of quality where you take a terrible C API, make it a bunch worse (you don't even use opaque pointers but a terrible "I made an int and pretended it was a pointer" thing), and then add a couple member functions and call it C++. Your API is so bad, I couldn't even work out what half of it was supposed to do to write an example replacement. Well, I wrote a better example in my free time, which you can find in my bitbucket repo. this is just the beginning of how it might begin to resemble actual C++. –  DeadMG Sep 2 '12 at 16:00
    
@deadmg: Your example is the old stuff. (already been there, and it's not suitable for api) –  tp1 Sep 2 '12 at 16:03
3  
Please take any extended conversation to Programmers Chat. Can any useful information be incorporated in the question or an answer? –  ChrisF Sep 2 '12 at 18:19
show 16 more comments

2 Answers

up vote 4 down vote accepted

There is in-fact a book that is precisely what you seek. It is call, appropriately enough, API Design for C++.The book's website has source code from the book and Errata as well.

share|improve this answer
    
Definite +1 for the book! I came to suggest this but turns out you beat me to it. –  zxcdw Sep 2 '12 at 15:48
    
+1: I am finishing reading this book and it is a great resource. Highly recommended. –  Korchkidu Jul 11 '13 at 17:19
add comment

This is pretty much impossible. The simple fact is that sometimes, you need the compiler to do a job, and you can't just magic that necessity away. There is no function that can make std::vector not a header-only library. The compiler can make many magics work, but you can't have them without invoking it, and that's a fact of life.

Here's what you can do: don't use templates where you don't need them. Here's what you can't do: anything else.

The simple fact is that recompiling with the new version really isn't that big of a burden compared to the advantages of performance, safety, and functionality you can get with statically typed libraries.

share|improve this answer
    
I mentioned that as an example to think about. what I'm looking for is guidance on other similar issues which I should prepare for, and best practices to handle those. –  johannes Sep 2 '12 at 17:16
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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