1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
<!DOCTYPE html>
<html lang="en">
<head>
<title>buetow.org - Having fun with computers!</title>
<meta charset='utf-8'>
<link rel="shortcut icon" type="image/gif" href="/favicon.ico" />
<style>
body { background-color: #282c34; color: #dfdfdf; margin: auto; max-width: 900px; }
img { display: block; max-width: 70%;}
pre { color: #ecbe7b; }
blockquote { color: #ecbe7b; }
a { color: #c678dd; text-decoration: none; }
a.textlink:before { content: " > "; padding-left: 2px; }
a:hover { color: #51afef; text-decoration: underline; }
h1 { color: #ff6c6b; }
h2, h3, h4, h5, h6 { color: #51afef; }
li { color: #98be65; }
</style>
</head>
<body>
<pre>Written by Paul Buetow 2016-11-20</pre>
<a class="textlink" href="../">Go back to the main site</a><br />
<h1>Methods in C</h1>
<p>You can do some sort of object oriented programming in the C Programming Language. However, that is very limited. But also very easy and straight forward to use.</p>
<h2>Example</h2>
<p>Lets have a look at the following sample program. Basically all you have to do is to add a function pointer such as "calculate" to the definition of struct "something_s". Later, during the struct initialization, assign a function address to that function pointer:</p>
<pre>
#include <lt;stdio.h>gt;
typedef struct {
double (*calculate)(const double, const double);
char *name;
} something_s;
double multiplication(const double a, const double b) {
return a * b;
}
double division(const double a, const double b) {
return a / b;
}
int main(void) {
something_s mult = (something_s) {
.calculate = multiplication,
.name = "Multiplication"
};
something_s div = (something_s) {
.calculate = division,
.name = "Division"
};
const double a = 3, b = 2;
printf("%s(%f, %f) =>gt; %f\n", mult.name, a, b, mult.calculate(a,b));
printf("%s(%f, %f) =>gt; %f\n", div.name, a, b, div.calculate(a,b));
}
</pre>
<p>As you can see you can call the function (pointed by the function pointer) the same way as in C++ or Java via:</p>
<pre>
printf("%s(%f, %f) =>gt; %f\n", mult.name, a, b, mult.calculate(a,b));
printf("%s(%f, %f) =>gt; %f\n", div.name, a, b, div.calculate(a,b));
</pre>
<p>However, that's just syntactic sugar for:</p>
<pre>
printf("%s(%f, %f) =>gt; %f\n", mult.name, a, b, (*mult.calculate)(a,b));
printf("%s(%f, %f) =>gt; %f\n", div.name, a, b, (*div.calculate)(a,b));
</pre>
<p>Output:</p>
<pre>
pbuetow ~/git/blog/source [38268]% gcc methods-in-c.c -o methods-in-c
pbuetow ~/git/blog/source [38269]% ./methods-in-c
Multiplication(3.000000, 2.000000) =>gt; 6.000000
Division(3.000000, 2.000000) =>gt; 1.500000
</pre>
<p>Not complicated at all, but nice to know and helps to make the code easier to read!</p>
<h2>Taking it further</h2>
<p>If you want to take it a lot further type "Object-Oriented Programming with ANSI-C" into your favourite internet search engine, you will find some crazy stuff. Some go as far as writing a C preprocessor in AWK, which takes some object oriented pseudo-C and transforms it to plain C so that the C compiler can compile it to machine code. This is actually similar to how the C++ language had its origins.</p>
<p>E-Mail me your throughts at comments@mx.buetow.org!</p>
</body>
</html>
|