summaryrefslogtreecommitdiff
path: root/gemfeed
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2022-01-29 22:15:05 +0000
committerPaul Buetow <paul@buetow.org>2022-01-29 22:15:05 +0000
commita120794657b10e41d21b4262a1098d68901e4701 (patch)
treedae627799efd5604690d002d609ee4ca3248338a /gemfeed
parent449a3221d67629f5a01ef8d3539892e01425f552 (diff)
Publishing new version
Diffstat (limited to 'gemfeed')
-rw-r--r--gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.md (renamed from gemfeed/2016-11-20-methods-in-c.md)39
-rw-r--r--gemfeed/index.md2
2 files changed, 29 insertions, 12 deletions
diff --git a/gemfeed/2016-11-20-methods-in-c.md b/gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.md
index 1ac01967..c4f6c031 100644
--- a/gemfeed/2016-11-20-methods-in-c.md
+++ b/gemfeed/2016-11-20-object-oriented-programming-with-ansi-c.md
@@ -1,10 +1,19 @@
-# Methods in C
+# Object oriented programming with ANSI C
-> Published by Paul at 2016-11-20
+```
+ ___ ___ ____ ____
+ / _ \ / _ \| _ \ / ___|
+| | | | | | | |_) |____| |
+| |_| | |_| | __/_____| |___
+ \___/ \___/|_| \____|
+
+```
-You can do some sort of object-oriented programming in the C Programming Language. However, that is very limited. But also very easy and straightforward to use.
+> Published by Paul at 2016-11-20, updated 2022-01-29
-## Example
+You can do a little of object-oriented programming in the C Programming Language. However, that is, in my humble opinion, limited. It's easier to use a different programming language than C for OOP. But still it's an interesting exercise to try using C for this.
+
+## Function pointers
Let's have a look at the following sample program. 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:
@@ -42,7 +51,7 @@ int main(void) {
}
```
-As you can see, you can call the function (pointed by the function pointer) the same way as in C++ or Java via:
+As you can see, you can call the function (pointed by the function pointer) with the same syntax as in C++ or Java:
```
printf("%s(%f, %f) => %f\n", mult.name, a, b, mult.calculate(a,b));
@@ -59,15 +68,15 @@ printf("%s(%f, %f) => %f\n", div.name, a, b, (*div.calculate)(a,b));
Output:
```
-pbuetow ~/git/blog/source [38268]% gcc methods-in-c.c -o methods-in-c
-pbuetow ~/git/blog/source [38269]% ./methods-in-c
+pbuetow ~/git/blog/source [38268]% gcc oop-c-example.c -o oop-c-example
+pbuetow ~/git/blog/source [38269]% ./oop-c-example
Multiplication(3.000000, 2.000000) => 6.000000
Division(3.000000, 2.000000) => 1.500000
```
Not complicated at all, but nice to know and helps to make the code easier to read!
-## The flaw
+## That's not OOP, though
However, that's not really how it works in object-oriented languages such as Java and C++. The method call in this example is not a method call as "mult" and "div" in this example are not "message receivers". I mean that the functions can not access the state of the "mult" and "div" struct objects. In C, you would need to do something like this instead if you wanted to access the state of "mult" from within the calculate function, you would have to pass it as an argument:
@@ -75,11 +84,19 @@ However, that's not really how it works in object-oriented languages such as Jav
mult.calculate(mult,a,b));
```
-How to overcome this? You need to take it further.
+## Real object oriented proramming with C
+
+If you want to take it further, hit "Object-Oriented Programming with ANSI-C" into your favourite internet search engine or follow the link below. It goes 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 similar to how the C++ language had its origins.
+
+[https://www.cs.rit.edu/~ats/books/ooc.pdf](https://www.cs.rit.edu/~ats/books/ooc.pdf)
+
+## OOP design patterns in the Linux Kernel
+
+Big C software projects, like Linux, also follow some OOP techniques:
-## Taking it further
+[https://lwn.net/Articles/444910/](https://lwn.net/Articles/444910/)
-If you want to take it 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 similar to how the C++ language had its origins.
+C is a very old programming lanuage with it's quirks. This might be one of the reasons why Linux will also let Rust code in.
E-Mail me your comments to paul at buetow dot org!
diff --git a/gemfeed/index.md b/gemfeed/index.md
index 4cdc1e36..144344dd 100644
--- a/gemfeed/index.md
+++ b/gemfeed/index.md
@@ -15,7 +15,7 @@
[2021-04-24 (0802 words) - Welcome to the Geminispace](./2021-04-24-welcome-to-the-geminispace.md)
[2021-04-22 (2122 words) - DTail - The distributed log tail program](./2021-04-22-dtail-the-distributed-log-tail-program.md)
[2018-06-01 (2176 words) - Realistic load testing with I/O Riot for Linux](./2018-06-01-realistic-load-testing-with-ioriot-for-linux.md)
-[2016-11-20 (0318 words) - Methods in C](./2016-11-20-methods-in-c.md)
+[2016-11-20 (0385 words) - Object oriented programming with ANSI C](./2016-11-20-object-oriented-programming-with-ansi-c.md)
[2016-05-22 (0512 words) - Spinning up my own authoritative DNS servers](./2016-05-22-spinning-up-my-own-authoritative-dns-servers.md)
[2016-04-16 (0248 words) - Offsite backup with ZFS (Part 2)](./2016-04-16-offsite-backup-with-zfs-part2.md)
[2016-04-09 (0425 words) - Jails and ZFS with Puppet on FreeBSD](./2016-04-09-jails-and-zfs-on-freebsd-with-puppet.md)