Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Welcome to Software Development on Codidact!

Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.

Post History

71%
+3 −0
Q&A C naming convention, module trigrams?

Starting with the goals: A naming convention typically aims at supporting several, partly contradictory goals, among which are the following: Compliance with the limitations of the language stan...

posted 2y ago by Dirk Herrmann‭  ·  edited 2y ago by Dirk Herrmann‭

Answer
#3: Post edited by user avatar Dirk Herrmann‭ · 2022-09-26T21:57:38Z (about 2 years ago)
  • Starting with the goals: A naming convention typically aims at supporting several, partly contradictory goals, among which are the following:
  • * Compliance with the limitations of the language standard and/or other standards that apply. There are many symbols that are reserved by the ISO-C standard.
  • * Avoid name clashes between code pieces. This can be code from different supplier companies, but even code from different teams. The risk of name clashes increases with scope, but also with the degree of re-use of the respective code in different contexts.
  • * Clarity ("Use variable names that mean something" - Kernighan and Plauger, 1974)
  • * Short to reduce typing and (more importantly) reading effort.
  • * Indicate architectural / module structure.
  • Particularly the second of the aforementioned points is a good reason to introduce prefixes for globally visible symbols (macros in header files, functions and variables with external linkage, ...), but module prefixes also support the fifth point. You are calling them "module trigrams", but I would recommend to think of them in a more general way:
  • * Think of them as namespaces that isolate/protect different sets of symbols from each other.
  • * Do not limit yourself to three letters (could be more, but also less).
  • * Consider even using them hierarchically.
  • The last point can be relevant if you need to combine code from different companies or plan your code to be re-used across many projects: I have worked at companies that, for this reason, put a company-prefix before the module prefix, even for smaller embedded systems.
  • ---
  • Now, to the contradicting goal of having short names: Prefixes increase symbol length, but they reduce the risk of name clashes. The risk of name clashes, however, is much smaller and more manageable in smaller scopes. For example, local variables don't have to (and should not) follow the same rules, using the prefix approach here is overkill. (Don't forget, it is all about risk - there is no absolute protection: Someone somewhere might still have the great idea to define a macro called "index" in a public header file...)
  • For symbols with internal linkage (like, static helper functions) there is no simple rule, because depending on how tools like debugger etc. work with the symbol names it may still be beneficial to use the prefixes there as well, and certainly also if you can not exclude the possibility that foreign header files are included into your .c code...
  • ---
  • Summary: The use of prefixes is a proven practice to avoid name clashes and show component structure. Understand your goals to see if and how to apply this practice best in your context.
  • Starting with the goals: A naming convention typically aims at supporting several, partly contradictory goals, among which are the following:
  • * Compliance with the limitations of the language standard and possibly other standards that apply. There are many symbols that are reserved by the ISO-C standard.
  • * Avoid name clashes between code pieces. This can be code from different supplier companies, but even code from different teams. The risk of name clashes increases with scope, but also with the degree of re-use of the respective code in different contexts.
  • * Clarity ("Use variable names that mean something" - Kernighan and Plauger, 1974)
  • * Short to reduce typing and (more importantly) reading effort.
  • * Indicate architectural / module structure.
  • Particularly the second of the aforementioned points is a good reason to introduce prefixes for globally visible symbols (macros in header files, functions and variables with external linkage, ...), but module prefixes also support the fifth point. You are calling them "module trigrams", but I would recommend to think of them in a more general way:
  • * Think of them as namespaces that isolate/protect different sets of symbols from each other.
  • * Do not limit yourself to three letters (could be more, but also less).
  • * Consider even using them hierarchically.
  • The last point can be relevant if you need to combine code from different companies or plan your code to be re-used across many projects: I have worked at companies that, for this reason, put a company-prefix before the module prefix, even for smaller embedded systems.
  • ---
  • Now, to the contradicting goal of having short names: Prefixes increase symbol length, but they reduce the risk of name clashes. The risk of name clashes, however, is much smaller and more manageable in smaller scopes. For example, local variables don't have to (and should not) follow the same rules, using the prefix approach here is overkill. (Don't forget, it is all about risk - there is no absolute protection: Someone somewhere might still have the great idea to define a macro called "index" in a public header file...)
  • For symbols with internal linkage (like, static helper functions) there is no simple rule, because depending on how tools like debugger etc. work with the symbol names it may still be beneficial to use the prefixes there as well, and certainly also if you can not exclude the possibility that foreign header files are included into your .c code...
  • ---
  • Summary: The use of prefixes is a proven practice to avoid name clashes and show component structure. Understand your goals to see if and how to apply this practice best in your context.
#2: Post edited by user avatar Dirk Herrmann‭ · 2022-09-26T21:56:48Z (about 2 years ago)
  • Starting with the goals: A naming convention typically aims at supporting several, partly contradictory goals, among which are the following:
  • * Compliance with the limitations of the language standard and/or other standards that apply. There are many symbols that are reserved by the ISO-C standard.
  • * Avoid name clashes between code pieces. This can be code from different supplier companies, but even code from different teams. The risk of name clashes increases with scope, but also with the degree of re-use of the respective code in different contexts.
  • * Clarity ("Use variable names that mean something" - Kernighan and Plauger, 1974)
  • * Short to reduce typing and (more importantly) reading effort.
  • * Indicate architectural / module structure.
  • Particularly the second of the aforementioned points is a good reason to introduce prefixes for globally visible symbols (macros in header files, functions and variables with external linkage, ...), but module prefixes also support the fifth point. You are calling them "module trigrams", but I would recommend to think of them in a more general way:
  • * Think of them as namespaces that isolate/protect different sets of symbols from each other.
  • * Do not limit yourself to three letters (could be more, but also less).
  • * Consider even using them hierarchically.
  • The last point can be relevant if you need to combine code from different companies or plan your code to be re-used across many projects: I have worked at companies that put a company-prefix before the module prefix, even for smaller embedded systems, in case code from various sources (suppliers) had to be brought together.
  • ---
  • Now, to the contradicting goal of having short names: Prefixes increase symbol length, but they reduce the risk of name clashes. The risk of name clashes, however, is much smaller and more manageable in smaller scopes. For example, local variables don't have to (and should not) follow the same rules, using the prefix approach here is overkill. (Don't forget, it is all about risk - there is no absolute protection: Someone somewhere might still have the great idea to define a macro called "index" in a public header file...)
  • For symbols with internal linkage (like, static helper functions) there is no simple rule, because depending on how tools like debugger etc. work with the symbol names it may still be beneficial to use the prefixes there as well, and certainly also if you can not exclude the possibility that foreign header files are included into your .c code...
  • ---
  • Summary: The use of prefixes is a proven practice to avoid name clashes and show component structure. Understand your goals to see if and how to apply this practice best in your context.
  • Starting with the goals: A naming convention typically aims at supporting several, partly contradictory goals, among which are the following:
  • * Compliance with the limitations of the language standard and/or other standards that apply. There are many symbols that are reserved by the ISO-C standard.
  • * Avoid name clashes between code pieces. This can be code from different supplier companies, but even code from different teams. The risk of name clashes increases with scope, but also with the degree of re-use of the respective code in different contexts.
  • * Clarity ("Use variable names that mean something" - Kernighan and Plauger, 1974)
  • * Short to reduce typing and (more importantly) reading effort.
  • * Indicate architectural / module structure.
  • Particularly the second of the aforementioned points is a good reason to introduce prefixes for globally visible symbols (macros in header files, functions and variables with external linkage, ...), but module prefixes also support the fifth point. You are calling them "module trigrams", but I would recommend to think of them in a more general way:
  • * Think of them as namespaces that isolate/protect different sets of symbols from each other.
  • * Do not limit yourself to three letters (could be more, but also less).
  • * Consider even using them hierarchically.
  • The last point can be relevant if you need to combine code from different companies or plan your code to be re-used across many projects: I have worked at companies that, for this reason, put a company-prefix before the module prefix, even for smaller embedded systems.
  • ---
  • Now, to the contradicting goal of having short names: Prefixes increase symbol length, but they reduce the risk of name clashes. The risk of name clashes, however, is much smaller and more manageable in smaller scopes. For example, local variables don't have to (and should not) follow the same rules, using the prefix approach here is overkill. (Don't forget, it is all about risk - there is no absolute protection: Someone somewhere might still have the great idea to define a macro called "index" in a public header file...)
  • For symbols with internal linkage (like, static helper functions) there is no simple rule, because depending on how tools like debugger etc. work with the symbol names it may still be beneficial to use the prefixes there as well, and certainly also if you can not exclude the possibility that foreign header files are included into your .c code...
  • ---
  • Summary: The use of prefixes is a proven practice to avoid name clashes and show component structure. Understand your goals to see if and how to apply this practice best in your context.
#1: Initial revision by user avatar Dirk Herrmann‭ · 2022-09-26T21:54:58Z (about 2 years ago)
Starting with the goals: A naming convention typically aims at supporting several, partly contradictory goals, among which are the following:

* Compliance with the limitations of the language standard and/or other standards that apply.  There are many symbols that are reserved by the ISO-C standard.
* Avoid name clashes between code pieces.  This can be code from different supplier companies, but even code from different teams.  The risk of name clashes increases with scope, but also with the degree of re-use of the respective code in different contexts.
* Clarity ("Use variable names that mean something" - Kernighan and Plauger, 1974)
* Short to reduce typing and (more importantly) reading effort.
* Indicate architectural / module structure.

Particularly the second of the aforementioned points is a good reason to introduce prefixes for globally visible symbols (macros in header files, functions and variables with external linkage, ...), but module prefixes also support the fifth point.  You are calling them "module trigrams", but I would recommend to think of them in a more general way:

* Think of them as namespaces that isolate/protect different sets of symbols from each other.
* Do not limit yourself to three letters (could be more, but also less).
* Consider even using them hierarchically.

The last point can be relevant if you need to combine code from different companies or plan your code to be re-used across many projects: I have worked at companies that put a company-prefix before the module prefix, even for smaller embedded systems, in case code from various sources (suppliers) had to be brought together.

---

Now, to the contradicting goal of having short names: Prefixes increase symbol length, but they reduce the risk of name clashes.  The risk of name clashes, however, is much smaller and more manageable in smaller scopes.  For example, local variables don't have to (and should not) follow the same rules, using the prefix approach here is overkill.  (Don't forget, it is all about risk - there is no absolute protection: Someone somewhere might still have the great idea to define a macro called "index" in a public header file...)

For symbols with internal linkage (like, static helper functions) there is no simple rule, because depending on how tools like debugger etc. work with the symbol names it may still be beneficial to use the prefixes there as well, and certainly also if you can not exclude the possibility that foreign header files are included into your .c code...

---

Summary: The use of prefixes is a proven practice to avoid name clashes and show component structure.  Understand your goals to see if and how to apply this practice best in your context.