C/C++

From Things and Stuff Wiki
Revision as of 18:28, 23 April 2016 by Milk (talk | contribs)
Jump to navigation Jump to search


total mess / mix

C

1972 / 1979

to separate out

  • http://en.wikipedia.org/wiki/C_(programming_language) - a general-purpose, imperative computer programming language, supporting structured programming, lexical variable scope and recursion, while a static type system prevents many unintended operations. By design, C provides constructs that map efficiently to typical machine instructions, and therefore it has found lasting use in applications that had formerly been coded in assembly language, including operating systems, as well as various application software for computers ranging from supercomputers to embedded systems.

C was originally developed by Dennis Ritchie between 1969 and 1973 at AT&T Bell Labs, and used to re-implement the Unix operating system. It has since become one of the most widely used programming languages of all time, with C compilers from various vendors available for the majority of existing computer architectures and operating systems. C has been standardized by the American National Standards Institute (ANSI) since 1989 (see ANSI C) and subsequently by the International Organization for Standardization (ISO).



  • Learn C The Hard Way will fill in the "beginning programmer" gap in the literature on the C Programming language. It will teach good modern C programming practices and avoid habits that lead to buffer overflows, security defects, and other problems that even experienced programmers cause. This book is designed for: Students who have read LPTHW or LRTHW. Programmers with skill in one other "scripting" language. Programmers who need to relearn C. Objective-C programmers who want better C skills. People who like a challenge.








  • https://en.wikipedia.org/wiki/crt0 - a set of execution startup routines linked into a C program that performs any initialization work required before calling the program's main function. It generally takes the form of an object file called crt0.o, often written in assembly language, which is automatically included by the linker into every executable file it builds.

C programs consist of variables and functions. The language consists of expressions and statements. Expressions are used to compute new values which can be either used directly – as in function arguments – or assigned to a variable. Statements are assignments, flow control, declarations, or blocks. Flow control is conditional (if then else), looping (for, while, or do..while), or multi-way conditional (switch). Blocks are enclosed in braces ( { … } ) and define a local scope. Declarations create variable instances.

C is a pretty old language so there weren’t a lot of neat ideas in play to steal. Block structuring was and is and is very nice. Any collection of statements within a function which is wrapped in braces is a block. The block creates a local scope which exists until the closing brace. This means you can define local variables which shadow external variables quite freely. This makes you code easier to read and safer to develop because you can use your locals locally and know that anything else which is used must be defined in a higher level scope.

One thing you cannot do in C’s blocks is define functions. C does not support nested functions, so you don’t get closures. [of course you can implement closures in C by writing a lisp interpreter and implementing closures in lisp and then . . . – which is how closures are implemented in Ruby and Python and a lot of other languages (which are actually implemented in C or some other similarly lower level language)]

Pointers – variables which contain addresses.

C has an implicit call stack and a heap for dynamically managed memory. The call stack is managed automatically: it get’s bigger when a function is called and smaller when the function returns. The heap is managed by you.

You allocate memory by calling a function which grabs some and reserves it for you. You get a pointer to the memory. You specified how big it is supposed to be and you’re supposed to be smart enough to remember that.

You free memory by calling a function (‘free(pointer)’) which returns the memory to the free list. If you forget to do this and forget the address of the allocated memory, you create a ‘memory leak’ while your program is running. If you free some memory which is still in use – either continuously or at some later time – interesting and bad things can happen.

Standard library

  • https://en.wikipedia.org/wiki/C_standard_library - the standard library for the C programming language, as specified in the ANSI C standard.[1] It was developed at the same time as the C library POSIX specification, which is a superset of it.[2][3] Since ANSI C was adopted by the International Organization for Standardization,[4] the C standard library is also called the ISO C library.

The C standard library provides macros, type definitions and functions for tasks such as string handling, mathematical computations, input/output processing, memory management, and several other operating system services.





to sort


  • The Descent to C - This article attempts to give a sort of ‘orientation tour’ for people whose previous programming background is in high (ish) level languages such as Java or Python, and who now find that they need or want to learn C.


  • https://github.com/j3ffhubb/libshds - provides a single header library of useful data structures with good performance and scalability characteristics, while being generic and object-oriented. The implementation is intended to be portable across as many platforms, compilers and C standards as possible.

Wherever practical, the library avoids implementing functions for data structures if the function does not scale well, and instead focuses on implementing functions that scale in O(1) if possible, or at least algorithms that scale in O(log n) (for searching, etc...) or O(n log n) (for sorting). libshds is not meant to be a full-blown framework to make C into a high(er) level language, but rather a lightweight and useful tool to ease the development of low-level code that scales.



int      foo[5];     // foo is an array of 5 ints
char    *foo;        // foo is a pointer to char
double   foo();      // foo is a function returning a double
  • The ``Clockwise/Spiral Rule - There is a technique known as the ``Clockwise/Spiral Rule which enables any C programmer to parse in their head any C declaration!

C has little namespacing functionality at the language level. In the case of identifiers (functions and variables), there is one namespace, subject to scoping rules. And any identifier that must be shared between two compilation units is necessarily shared between them all: when you “extern” an identifier, you are using the link-level namespace.

The common workaround to C’s lack of namespaces is to use a standard name prefix for each module. The prefix indicates the app, library or module the name belongs to. For example, in Subversion you have names like svn_fs_initialize — this indicates that the function belongs to the svn_fs library. Subversion describes several layers of namespacing conventions. svn_fs_initialize is an example of a name in the public API. Names that need to visible to other modules within a single Subversion library use a double underscore to separate the namespace, for example, svn_fs_base__dag_get_node. Finally, non-exported functions used within a single module do not use a prefix.



  • Talloc is a hierarchical, reference counted memory pool system with destructors. It is built atop the C standard library and it defines a set of utility functions that altogether simplifies allocation and deallocation of data, especially for complex structures that contain many dynamically allocated elements such as strings and arrays.


  • Comprehensive C Archive Network (CCAN) - That nice snippets of C code should be moved out of junkcode directories and exposed to a wider world, where they can become something useful.



  • libevent – an event notification library. The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts. libevent is meant to replace the event loop found in event driven network servers. An application just needs to call event_dispatch() and then add or remove events dynamically without having to change the event loop. Currently, libevent supports /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4).


  • libev - A full-featured and high-performance (see benchmark) event loop that is loosely modelled after libevent, but without its limitations and bugs. It is used in GNU Virtual Private Ethernet, rxvt-unicode, auditd, the Deliantra MORPG Server and Client, and many other programs.

Features include child/pid watchers, periodic timers based on wallclock (absolute) time (in addition to timers using relative timeouts), as well as epoll/kqueue/event ports/inotify/eventfd/signalfd support, fast timer management, time jump detection and correction, and ease-of-use. It can be used as a libevent replacement using its emulation API or directly embedded into your programs without the need for complex configuration support. A full-featured and well-documented perl interface is also available.




  • MetaC language extends C in a 100% backward compatible way with reflective features and techniques for refactoring, reconfiguring and modifying arbitrary C source code. Therefore, the extensions provide special metadata types for working with source code information, syntactical structures for the definiton of code templates, and metafunctions to gather information about source code and refactor, modify, delete, or insert code.



  • musl provides standard C/POSIX library and extensions, consistent quality and implementation behaviour from tiny embedded systems to full-fledged servers. Minimal machine-specific code means less chance of breakage on minority architectures and better success with “write once run everywhere” C development.

musl's efficiency is unparalleled in Linux libc implementations. Designed from the ground up for static linking, musl carefully avoids pulling in large amounts of code or data that the application will not use. Dynamic linking is also efficient; by integrating the entire standard library implementation, including threads, math, and even the dynamic linker itself into a single shared object, most of the startup time and memory overhead of dynamic linking have been eliminated.


  • Cello is a library that brings higher level programming to C. By acting as a modern, powerful runtime system Cello makes many things easy that were previously impractical or awkward in C such as: Generic Data Structures, Polymorphic Functions, Interfaces / Type Classes, Constructors / Destructors, Optional Garbage Collection, Exceptions, Reflection [7]


  • FFTW is a C subroutine library for computing the discrete Fourier transform (DFT) in one or more dimensions, of arbitrary input size, and of both real and complex data (as well as of even/odd data, i.e. the discrete cosine/sine transforms or DCT/DST). We believe that FFTW, which is free software, should become the FFT library of choice for most applications.


  • SWIG is a compiler that integrates C and C++ with languages including Perl, Python, Tcl, Ruby, PHP, Java, C#, D, Go, Lua, Octave, R, Scheme (Guile, MzScheme/Racket, CHICKEN), Scilab, Ocaml, Modula-3, Common Lisp (CLISP, Allegro CL, CFFI, UFFI) and Pike. SWIG can also export its parse tree into XML and Lisp s-expressions.

SWIG reads annotated C/C++ header files and creates wrapper code (glue code) in order to make the corresponding C/C++ libraries available to the listed languages, or to extend C/C++ programs with a scripting language.



  • clib(1) - Package manager for the C programming language.
  • https://github.com/attractivechaos/klib Klib is a standalone and lightweight C library distributed under MIT/X11 license. Most components are independent of external libraries, except the standard C library, and independent of each other.



C++

1983




using namespace std

After you write this instruction, if the compiler sees string it will know that you may be referring to std::string, and if it sees vector, it will know that you may be referring to std::vector. (Provided that you have included in your compilation unit the header files where they are defined, of course.)

If you don't write it, when the compiler sees string or vector it will not know what you are refering to. You will need to explicitly tell it std::string or std::vector, and if you don't, you will get a compile error. [12]




  • Boost provides free peer-reviewed portable C++ source libraries.



  • Hoard is a fast, scalable, and memory-efficient memory allocator that can speed up your applications. It’s much faster than built-in system allocators: as much as 2.5x faster than Linux, 3x faster than Windows, and 7x faster than Mac.
  • Memory Pool System is a flexible and adaptable memory manager. Among its many advantages are an incremental garbage collector with very low pause times, and an extremely robust implementation. It's both open source and commercially licensed.
  • Simple DirectMedia Layer is a cross-platform development library designed to provide low level access to audio, leopard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. It is used by video playback software, emulators, and popular games including Valve's award winning catalog and many Humble Bundle games.
  • openBliSSART is a C++ framework and toolbox that provides "Blind Source Separation for Audio Recognition Tasks". Its areas of application include, but are not limited to, instrument separation (e.g. extraction of drum tracks from popular music), speech enhancement, and feature extraction. It features various source separation algorithms, with a strong focus on variants of Non-Negative Matrix Factorization (NMF).


  • http://libcinder.org/ Cinder is a C++ library for programming with aesthetic intent - the sort of development often called creative coding. This includes domains like graphics, audio, video, and computational geometry. Cinder is cross-platform, with official support for OS X, Windows, iOS, and WinRT. Cinder is production-proven, powerful enough to be the primary tool for professionals, but still suitable for learning and experimentation. Cinder is released under the 2-Clause BSD License.
  • cdecl - C gibberish ↔ English
    • cdecl, c++decl - Compose C and C++ type declarations


openFrameworks

  • openFrameworks is an open source C++ toolkit designed to assist the creative process by providing a simple and intuitive framework for experimentation. The code is written to be massively cross-compatible. Right now we support five operating systems (Windows, OSX, Linux, iOS, Android) and four IDEs (XCode, Code::Blocks, and Visual Studio and Eclipse). The API is designed to be minimal and easy to grasp. openFrameworks is distributed under the MIT License. The toolkit is designed to work as a general purpose glue, and wraps together several commonly used libraries, including:
  • OpenGL, GLEW, GLUT, libtess2 and cairo for graphics
  • rtAudio, PortAudio, OpenAL and Kiss FFT or FMOD for audio input, output and analysis
  • FreeType for fonts
  • FreeImage for image saving and loading
  • Quicktime, GStreamer and videoInput for video playback and grabbing
  • Poco for a variety of utilities
  • OpenCV for computer vision
  • Assimp for 3D model loading