At the risk of being featured in a future episode of "Hacker News reacts to (Dropbox|iPhone)"...
...a Makefile and vim (or emacs, or even nano, I'm not going to judge your kink) are fine. If they are not fine, then C is probably not the right language for the project.
I did not read this as gatekeeping, rather I read it as an opinion on the suitability of C for kinds of project. If vim + make isn't enough, then C is probably not the appropriate language. Not that you shouldn't use C if you don't use vim + make.
We always talk about how good engineers "choose the right tool for the job". I don't think expressing an opinion on what the right kind of job is for a particular tool should be out of bounds. (Setting aside whether the opinion is correct or not.)
Editor preference was not intended to be the focus of my comment, it was more me being incredulous that someone would build something in C which necessitated Docker.
If someone wants to do that anyway, I am going to be perplexed that C was the language choice rather than golang or rust, and perhaps worried about C being a footgun WRT security, but whatever.
Yeah, the Docker part makes sense. You don't need it, but it can be nice. Don't want mundane differences between devs' setups to get in the way, especially when they're not all the same OS.
That's usually not the case. You work on existing code base and you want your editor to be able to explore it efficiently. Changing language is rarely an option unless you happen to enter a project at the very start.
It is gatekeeping. The poster was not offering advice, they were being actively discouraging. You can argue shades of grey, but at the end of the day this is an unsolicited discouragement, and an arbitrary out-grouping.
The fact that you don't see this as problematic, is problematic.
There is no gatekeeping. There is a suggestion that C is best used for projects that have builds no more complex than a Makefile configuration. There is explicitly no ~judgement~ limit on what ~kink~ text editor one may use to edit the files.
the fact that they don't see it as problematic means that they didn't misinterpret the comment the way you did, which is because they know things you don't
thus hegemonic institutions reinscribe the kyriarchy generation after generation by perpetuating a hierarchical opposition between "knowledge" and so-called "ignorance", which is socially constructed to be inferior, less than, but which serves the purpose of distinguishing the graduates of elite institutions (to which access is mediated by the financial privilege of the bourgeoisie) from the subaltern underclass; thus "knowledge" serves the interests of capitalism by reproducing oppressive class divisions, enabling the continued exploitation of the working class
what could be more problematic than that?
but if you're interested in learning something and not just playing word games to gain status by putting others down, i problematically mansplained what you're missing in https://news.ycombinator.com/item?id=37083233
The proposed solution of a text editor and makefile is a lot easier to setup than the what's proposed in the blog post, I would call this the opposite of gatekeeping.
I get that, but even figuratively, it's a relatively harmless opinion that can only achieve as much by way of influence or control as readers are willing to allow the anonymous commenter to hold over them. There's more to learn if we confront the opinion by its premises (as shown by other responses to the comment) than by subjective moral grounds.
The term has become common on the web to refer to enthusiasts trying to control how people enjoy/use a term or participate in an activity - for instance "real fans only like the stuff from before $album" or "only filthy casuals play the game that way" (or "you shouldn't use C if you want modern, good tooling"). This might be worth reading through:
If vim and make are spooking somebody, they need to turn tail and run the fuck away from C. I love it to death, but it's a frustrating experience from another era. vim and make are the least of your worries when dealing with it.
> but it's a frustrating experience from another era
Are you using C99 features? I find the "new" features extremely enjoyable, it feels like a different language compared to C89 or the common C/C++ subset.
Started coding in 1986, used my first UNIX (Xenix) in 1993, the only thing I care about vi, is knowing enough to rescue me when there isn't anything else installed to edit files.
Yep, plenty of really good windows/macos programmers have never touched vi or emacs. I'm not sure why users of those are so elitist. I tend to prefer vim editor keystrokes in my editors but that's just because I got used to it from college and terminal editing.
they're saying that you don't need to be comfortable with ides and fancy debuggers and cmake and language servers and game development engines and ci pipelines and all kinds of complicated stuff to write c successfully
a bare-bones text editor and the most minimal build system are plenty
and if they aren't plenty, they're not saying that's a problem with you, but with c
i don't agree (ctags, valgrind, git, and gdb go a long way towards making c usable, and evidently c is the best language for a lot of things even ctags and gdb struggle with, like linux kernel drivers, and cmake evidently helps a lot if you care about ms-windows) but that's what they said, and you totally misunderstood them because you somehow got the idea that vim and make are some kind of super advanced tools rather than relics from the 01980s
they're maybe a bit unprepossessing at first glance but mostly what they are is simple and primitive
think of using a hammer rather than a cam-driven turret lathe
you can go lower tech than make too now that cpus and c compilers are so fast
while sleep 1; do # ci pipeline
gcc -Wall -funny -mtune=i69 *.c -lm -liberty -letmypeoplego -o proggie && # build system
./proggie --run-tests # test runner
done
c compiles fast enough that this scales to several thousand lines of code, c++ very much does not
of course you need a testing framework
if (!strcmp(argv[1], "--run-tests")) return run_tests();
now i'm not saying you shouldn't write a test runner in unity and distribute your ci pipeline with zmq and mqtt and whatever the fuck. better ux is worth my weight in gold, and i have programmer gut. also zmq is metal as fuck
what i am saying is that the difference between no test runner and an infinite loop in bash is much bigger than the difference between the bash loop and circleci or gitlab pipelines. so don't be intimidated by articles like this which make it sound like you need a team of phds to set up a test runner. writing tests and running them is what helps, not so much stylishness
except for version control. a build script in shell is a serviceable alternative to make, but cp -a proggie/src snapshot.$(date +%Y-%m-%d) is not a serviceable alternative to git
also if 3d test runners with inotify and particle systems with custom shaders mean that people write more tests and see the tests fail sooner after they break shit, that could make a real difference
I'm not a he (some other folks used "they" which is fine), but this is otherwise a pretty good interpretation - it absolutely was a dig at C, not elitism.
If you're going to learn a bunch of modern tooling and start a green field project that justifies that complexity, C is generally a poor choice. Learn a modern language.
I use C somewhat regularly, including for kernel stuff, embedded, and legacy code.
Mostly, though, when I use C, it's because I'm doing a small thing that I need to be very fast, and I haven't yet bothered to get comfortable with Rust.
oops, i'm sorry i misgendered you. i think i have fixed it now, but now the editing window has closed
on your other points i mostly agree, except that if i write a library in any popular 'modern' language, it can only be called from that language, which seems like a missed opportunity
and when i went back and compared development time logs, the development speed advantages of modern languages seem to be only a factor of 2 or 3 over c, once i get beyond a few hundred lines
which i guess is why linux, firefox, cpython, gcc, apache, poppler, libvte, and so on are written in c or occasionally c++. it's not because the authors didn't know about common lisp, scheme, ml, smalltalk, and so on, or couldn't figure out how to write a garbage collector
rust and some other unpopular modern languages look like they might change that situation (nim, zig, koka, a couple of others i can't think of right now)
You can write C how ever you want, doesn't mean it's the right language for the project. My team uses C++ a lot like Java, and turns out Java was the better tool for our use case.
They don't, cause the speed at which we have to implement new features means cutting corners. We write backends, none of which are performance-critical. A lot of faster algos that would take too long to implement in C++ get skipped, so in the end it's slower than partner teams' Java code that does similar things, but again it doesn't matter as long as nobody notices the latency.
This is not a matter of taste. VSCode is an alien in the C world. It's clumsy, demanding and offers plenty of useless features, whereas the simple stuff is hard / impossible to get to work.
If you work on a C project, you need to be ready to have to edit source code, at least minimally, from an environment that doesn't have GUI. You will have to interact with pagers, man readers, readline a lot -- it's a lot more convenient if your editor works in the same way as those tool.
You are just creating unnecessary problems when you use VSCode or a similar editor. And I cannot think about a single benefit that would come from using it. Beside other things, it's just a crappy text editor... the only thing that's going on for it is that it's a Web browser application... which is kinda worthless when it comes to a typical C project.
If you're using vsc then C is absolutely not the right language. If your code can't fit in your head when you're writing it then you have no hope of debugging it. Vsc very much encourages your code to grow as large as the machine you're wiring it in can handle.
So, let's say we have a project. For whatever technical (or social, historical, religious...) reason, C is chosen as the right language.
Why does that imply that the programmers on that project should therefore write that C code in a terminal, with no linter, code formatter, static analysis, test runner, etc.?
The point that I think everyone else is missing is that C is actually hard to work with and write correctly. If your project is sophisticated enough that you can't get by with basic tools, then maybe C isn't the best language for your project.
I think this idea of "basic tools" is highly debatable, especially with developers who are young enough for heavy IDEs like visual studio to have been their intro to coding (or similarly for people who enjoy programming but aren't so invested in the entire computer software stack to really care about knowing their environment particularly well).
Eg while I enjoy understanding all the layers of software in a computer and am perfectly comfortable with vim and a makefile (although I prefer vscode and cmake), most of the other developers I work with are just as competent with C, but can't really function if they can't use visual studio. To them visual studio is the basic tool and vim+make are advanced tools.
I meant "basic" in the sense that it does not have a lot of helpful features for developing complicated applications. Whether or not that's easy or hard for any individual to use isn't really relevant.
That said, Vim has some IDE-like features, moreso for C (by default) than some other languages.
Again, the point is that C is complicated and hard to work with as you scale up into a bigger project, not that my tools are better than your tools.
more gatekeeping. If I'm using C I want to use modern tools like every other language. If my environment doesn't have a debugger, tools like valgrind, linter, etc I don't have any use for it.
20 years ago, I worked on a C and C++ project that supported a billion dollar business. Almost everyone used vi. They used none of those other tools, and there were maybe a half dozen unit tests in the whole project. I sure hope times have changed.
At the time, I was a junior engineer, barely out of school. This company was run, technically, by people with 30+ years of experience. They preferred manual testing.
Also, I'll add that automated testing was definitely not as much of a thing in 2003 as it is in 2023.
A project manager, probably. "Advocating for XYZ" costs emotional capital that I'm not necessarily willing to devote to a particular project, or to my employer at all.
Weird strawman. Those tools all run on terminals. IDEs use tools that run on terminals.
Teams can use a combination of different IDEs and run the tools at different levels or their pipelines, which necessitate that they be automatable (and not GUI only).
You're missing the point, they aren't saying "your development process should never involve a terminal" but rather "you don't necessarily have to use this bare-bones setup which happens to be terminal based"
Docker is a godsend when you're a solo embedded consultant and a former customer comes to you five years later with an urgent firmware feature request and cash in hand.
If you don't have the exact machine any more, then it's "Good luck getting the toolchain and build environment from the vendor!"
Docker has saved my bacon at least twice in this manner.
I'd consider a VM, and I've used them before, but I've found Docker gives the advantage of forcing me to be thorough in my toolchain docs, and portable to CI pipelines.
chroot sounds like nothing but a headache.
QEMU VM, I don't even understand the potential advantage of lol
QEMU for emulating different hardware I guess. Actually I was wondering how you test firmware repeatably without hardware emu; never dealt in firmware myself.
Would a five year old Docker image still work? I mean, probably, but for long term maintenance of a build environment, I would feel significantly better with a VM.
I have Docker images older than that I use regularly.
For things where kernel changes matter, sure a VM may provide better isolation, but should you ever run into problems running your older Docker images, you can easily solve that by spinning up a VM to run Docker in as a worst case fallback.
Docker strikes a nice balance of ease of integration and sufficient isolation for most situations.
I write a lot of pure Win32 C, and I don't even need a Makefile for the majority of my projects because they're just compiled as a single file and quickly enough that I don't bother with anything more than necessary.
IMHO the "tool fetish" that a lot of (mostly newer) programmers seem to have is an artifact of a mentality that favours complexity and novelty over simplicity and efficiency. They will waste tons of time and resources configuring and debugging (often with little understanding) huge complex monstrosities of "development environments", and end up feeling more productive, but in reality aren't.
This article just further confirms what I'd already expected with the word "modern".
For a lot of small and even medium-size C projects, one file is enough. IMHO having dozens of tiny files with only a few dozen lines each is an antipattern.
How many LOC is "medium" in your view? Most devs I work with would only put a thousand lines of code in a single file (obviously subjective, depends on density, comments etc). I'd still consider that a toy app, as opposed to my medium mark at about 100k LOC. At that stage you certainly benefit from all the tooling you seem to eschew. "Large" projects (the likes of Linux and Chromium) have so much mass they tend to have fully customized build systems.
I wrote my first Java code in Notepad and compiled it from command.com (as Windows 9x still called it). It was... fine, I guess? For the era? Not what I would want to do but far from unmanageable.
I used to do that for years, and then I discovered gdb and IDE integrations with it (code blocks, codelite) and later visual studio. I have no idea why anyone would subject themselves to developing without breakpoints in 2023 other than to larp as an 80s MIT hacker
I started writing in C with an IDE then realized much later on that I don't really need breakpoints, I just log stuff. Whatever I'm testing often won't easily work in the debugger (or won't reproduce the bug there due to timing), and even when it does, it's not significantly easier than logging.
Also, every new job I've had, I've watched my coworkers spend like a week trying to figure out how to make the IDE work with whatever environment, which then changes later... I just skip that.
Debuggers have logpoints as well as breakpoints. Learning to use a debugger grants you access to this kind of basic "log-debugging" with the option to use more advanced techniques (traditional breakpoints, break on value change, etc) at your fingertips.
> Also, every new job I've had, I've watched my coworkers spend like a week trying to figure out how to make the IDE work with whatever environment, which then changes later... I just skip that.
A single week to achieve better productivity? That's a sweet deal. It's about as much time as you need to figure out how the work email works, learn how to get to the cafeteria from your desk quickly, and so on. It's absurd to think that you'll be 100% productive that first week anyway, so why not use the opportunity to familiarize yourself with the tooling as well?
If it were a week to actually get better productivity, and that setup never broke later, then sure. It doesn't really help because of how few things are actually runnable in the debugger (basically just unit tests). Nobody else on my team even uses the debugger, they only use IDEs out of comfort, and so far they've had to switch IDEs 3 times in 3 years.
Past jobs had similar caveats. The only time I've ever been able to use a debugger consistently was in school.
Personally with visual studio and vcpkg, I never have an issues with setting up the environment. Vcpkg in particular makes it easy to note have to do manual linking, and it handles x86 vs x64 automatically as well.
But in all seriousness. Using a debugger can be useful, and even though I've given it a try numerous times, I mostly avoid it because it doesn't fit the way I think.
Debugging is about searching for the source of the problem. With print debugging I'm always leaving behind breadcrumbs which I can inspect all at once at the end. If I'm going down a wrong path I delete the wrong ones and add new ones until I find the issue.
With a debugger I have to mouse around, put breakpoints, run the code, inspect where I'm at, step through, decide that this breakpoint is useless, and have to have all this state in my mind. If I get lost, I have to start from scratch.
Print debugging matches my way of thinking much more.
Logpoints! They're like breakpoints, but they don't stop execution. And they don't require whatever you're writing C for to have any sort of console output. Of course you do need to have a debug port enabled, which often isn't the case for production hardware so you get stuck printf debugging by blinking an LED and probing it with a logic analyzer. Royal PITA.
There are small projects, hobby projects, and large industrial projects. For hobby projects in C, I am myself very happy with a shell, make, a text editor, git and valgrind.
Imagine developing an embedded device for medical or aerospace hardware : you are going to provide lost of effort into testing. You are going to work with teams of people with varied abilities and experience : it's going to get a little bureaucratic, there are going to have rules and guidelines. Enforcing those with tools remove part of the friction, if done well.
Avionics code isn't written by hand any more. We (society) can't write sufficiently reliable C such that pilots and passengers can rely on it. Writing C by hand these days is hubris, in my opinion.
Most avionics these days are done in Simulink, and then you hit the Autocode button.
A big usecase for C is embedded systems projects where wrangling cross-compilers, debug dongles, etc. can become a big headache especially when trying to keep multiple developers' local toolchains in sync or when managing multiple projects with different requirements for the development environment.
PlatformIO is a dream for this, running build on a project automatically downloads the required toolchains for the target and orchestrates the build process for you.
That reads almost like a disparagement of GCC/Clang; the reality is you can just build on pretty much any host system directly and it will work. Having clean and repeatable builds is extremely useful, and Docker is a reasonable way to do that, but that shouldn't mask the importance of understanding the native runtime dependencies of the program once used outside of that one container. A concrete example of that: don't compile a C program in an Alpine Linux Docker image with dynamic linking, or it you won't be able to run the resultant binary on a RHEL machine. This is contrast to languages which run atop a virtual machine or interpreter, where the details of the build environment rarely matter on the runtime machine.
Its a disparagement at the fact they're dated, rather than the software itself.
GCC searches by default in /usr/include and friends, (and a similar set of paths for library paths), meaning that one random library you downloaded 11 years ago is now perpetually on your search path.
I write a decent amount of go, and it's not wildly useful there either but I still use them as the rest of the tooling is good enough that it works for me.
> If they are not fine, then C is probably not the right language for the project.
It's for C/C++ as author says, not just for C. And even if you're using Qt and write mostly QML you still need some C++ and it's much easier with code completion. I'd rather use VSCode than Qt Creator for that and I'm certainly not going back to vim.
I once had to compile cmake from source (the cmake version of something I needed to build was lower that the OS version of cmake). Not a fun afternoon.
IMHO any proposed solution (for any programming language) should also include a step-debugger that's directly integrated into the edit-compile-test workflow, otherwise people don't know what they are missing out on.
I write a bunch of C for various projects of mine and i do it in an editor with some C understanding (it varies by which, but the latest combo is Kate with a Clang-based LSP, however i've also used "plain" text editors with barely if at all any understanding like Notepad++ and Geany, both of which give you at best word completion with words they picked up from the buffer without actually knowing what they mean).
I also write Free Pascal using Lazarus, an IDE which actually understands the language at a deep level.
The experience writing the latter is way *WAY* better than the former and my opinion to that isn't "just write more in Free Pascal" but "i want an IDE for C that is at least as good as Lazarus is for Free Pascal".
I want a C IDE that, among others:
1. Can understand the code so that when i, e.g., want to rename the identifier "foo" it doesn't try to rename it as a keyword but knows if it refers to a local variable, global variable or struct member and only update references to that.
2. Can understand the code so that if i use a symbol defined in a header file that the current module doesn't include by itself it can put it in the includes section automatically (or at least ask me to) instead of waiting for the compiler to fail. If there is some conflict (e.g. because the symbol definition depends on macros or whatever) it should be able to understand that.
3. Can understand the code so that it can move structs, functions, etc around in modules and update header files and their uses in other modules automatically.
4. Can understand the code so that it can convert a struct defined in a header file to an opaque struct and vice versa, for the former being able to tell me which existing code would break and offer fixes (e.g. automatically creating accessor functions for the members).
5. Can understand the code so that it can expand macros in place visually, allow me to edit the macros expanded in-place while actually modifying the header file (or wherever the macro is defined) and also quickly tell me where the macro is used in other places.
6. Can understand the code so that it can convert code to functions, expand functions inline (with any local variables being placed at a decent position and any conflicts handled - it can ask for example if it sees the inline code to use "for (i=1; i<10;" and the existing code also has a "int i" if it should reuse the "int i" or replace it with heuristics that provide decent defaults), add/remove arguments (with automatic updates wherever they are used), etc.
7. Can understand the code so that one can create queries like "replace all string literals to non-static functions whose name matches the '^foo_.*$' regex with calls to macro 'TXT' and the same string literal as the parameter to macro".
8. Has a debugger that works with all the basics (breakpoints, step in/through/out, watches, etc) and...
9. The debugger can modify a variable while the program is running.
10. The debugger can make function calls while the program is running.
11. The debugger can modify a function while the program is running (any new calls are done to that function).
12. The debugger can watch data over time and be able to display values in various means like various graph types.
13. The debugger can tell you where (in code) some use-after-free was originally allocated and then where it was freed and where it was used, all with nicely shown arrows, hyperlinks and graphics directly inside the editor instead of you having to manually parse (in your head) some callstack. Similar for other types of errors like accessing invalid pointers, array data out of range (should tell you both the range and the accessed index where that can be statically inferred), etc.
14. The debugger can put conditional breakpoints which:
14a. Can call functions defined in the program.
14b. Can check if the breakpoint comes from a specific callstack (e.g. break if function "foo" is called from "bar" but not from "baz").
14c. Can access local variables and arguments up the callstack (obviously the breakpoint will only break where that is possible).
15. There is a profiler that works and...
16. The profiler can create call-based profiles (think gprof) and statistics-based profiles (think perf).
17. The profiler can record the full callstack instead of just the function name.
18. The profiler can create full call diagrams (see Luke Stackwalker[0] as an example) as well as flamegraphs (see some perl script for perf i don't remember).
19. The profiler can keep track not only where* but also when* a sample was taken so it can create profile timelines. Actually just have it do everything i had a profiler i wrote some time ago for Free Pascal[1], including be able to be instrumented by the running program, filter via thread, call stack depth, etc.
20. The profiler can call functions in the profiled program to create additional profile (e.g. if you want to count how many files are opened or how many rays your raytracer is casting or whatever so you can use the full profiler functionality instead of hacking up your own)
21. There is a static analysis tool that works and...
22. ...works like whatever Xcode's integration with Clang's analyzer is, i do not have much experience with those but i remember using it a couple of times years ago and thinking it was neat. I haven't seen any other graphical integration of a code analysis tool, pretty much every other analyzer feels like compiler warnings++. More of the graphical approach and less of the warnings++ approach please.
23. There is some form of project management / build tool / whatever that the IDE uses and...
24. The IDE can let you setup various "configurations" for build options (including preprocessor defines, which files/objects/libraries are to be included, etc) that can be mixed and matched at will (e.g. a "lightweight" and "full" configuration set could be mixed with a "win32" and "linux" configuration set with the latter relying on the "unix" configuration and none of those would need you to duplicate any information).
25. The IDE can know about libraries, be able to locate them as well as place them in appropriate locations when you are building a library. Libraries should be able to be built as both statically and dynamically linked if that is needed. If a library A relies on another library B and a program uses library A it should not need to also specify library B too - in the exceptional case where that is needed (e.g. there are alternative versions of library B) it should allow that but it should not be necessary.
26. Setting up the above should not need to be done via arcane text files but via a nice GUI that doesn't hate the user - e.g. using a library should not need you to type it's name but allow you to check next to its name in a listbox with checkboxes (with name filtering and categories). It should also know about different system libraries for the same thing (e.g. OpenGL in Windows, Linux and Mac is accessed via different ways). This should be configurable, not hardcoded - a custom library should also be able to use that functionality. Note that all of this can be stored in text files (e.g. for easier VCS support) but not needed.
27. More of a #26b but i think it deserves its own point: in addition the IDE should have deep knowledge of what a library offers and like #2 if it knows a symbol being offered by a library it should automatically add it to your project's requirements.
28. Again more of a #27b but also a #2b: it should be able to clean up any unused stuff (either automatic or explicitly). In total i should, e.g, be able to use OpenGL by typing "gl", pressing the auto-complete key (ctrl+space or whatever) and have the IDE suggest all the "gl" prefixed functions like "glClear", then once i select "glClear" (or whatever), the IDE adds the #include <GL/gl.h> header and the libgl library in the dependencies. If i press Ctrl-Z to undo that, the header files and library dependencies (if added) will be removed. If i press Ctrl+S to save or some other key to cleanup the project (depending on the configuration), any unused headers and libraries should be removed.
I could write for more but basically i'd like an IDE (i haven't touched topics like VCS support and how i'd like to be able to see and use different version of the code from inside the IDE - like e.g. go back in time to a different function while the debugger is running - or anything that has to do with GUIs) that is smart and helps me get rid of all the manual drudge,
(also FWIW little of the above is provided by Lazarus and i'd also like Lazarus to do all that where it makes sense but it still does more than pretty much any C IDE i've used)
I wrote some simple C a while ago and my go to IDE (which ostensibly says it supports C/C++ out of the box) wasn’t working, and since this was just a dabble, I was really not interested in fighting the IDE.
And, mind, I haven’t touched C in 20 years.
So I fired up Xcode. And, boy, that was easy. For my silly thing, I fat fingered and left thumbed my way to success.
No doubt Xcode has its critics and limits, but for my 3 hour project, I got to focus on my code and not the IDE.
I have another, more substantial pure C, not Mac specific, project I’m thinking of starting, and I’ll go with Xcode until it fails me.
>No doubt Xcode has its critics and limits, but for my 3 hour project, I got to focus on my code and not the IDE.
XCode has to carry a lot on its shoulders these days - C, c++, objective c, SWIFT and a lot of GUI editors, so it's impressive for what it is.
But it can easily support simple c/c++ projects, I've actually developed apps there and then ran them on linux, sometimes with the odd #ifdef to make it compiles on linux, but the dev experience on XCode is better for me than anything I can get on linux.
Really. I'm not kidding. It's all there. Not for everybody but /clearly/ very much for you. (Unless you move the incredibly complex goalpost you've set up here).
It has a learning curve to configure and to use but if the above 28 is what you want as you say you /can/ have them all.
All of them? Including things like the modify a function while the application is running, either directly or using an old version from VCS and things like know all the available libraries, the symbols they export and what header files to include to use them and then be able to do that "type gl, press ctrl+space (or whatever), have glClear (or whatever) show up and have the IDE automatically add #include <GL/gl.h> at the top and 'libgl' as a required library on Linux, 'opengl32' on Windows and 'OpenGL framework' on Mac OS X with Ctrl+Z undoing all that stuff"?
If so i'd be impressed - and TBH ~17 years ago i did use Eclipse CDE and found it superior for C and even C++ code compared to what i saw people praise MSVC for (though MSVC's debugger was better than the GDB front-end functionality Eclipse CDE provided), so i don't think it is unlikely. I do remember it having some neat integration with Trac back then too. I mainly stopped using it because the computer i had at the time struggled to run both Eclipse and Mozilla at the same time :-P. But ~17 years ago i always praised it with the only annoyance (resource usage aside) being that weird "workspace" approach, but that was minor.
I didn't think much about it because it seemed to have fallen out of fashion since then so i thought it is just limping along.
I think i'll be trying it out then :-) perhaps it is time to go back to Eclipse CDT if that is the case.
EDIT: eh, tried it, not impressed. First of all Eclipse crashes or hangs almost every time i try to edit the settings.
Then i tried to make a test library, "librola" (random name) to be used by a program "rolathing". First i made the library using the managed C project with the "Linux GCC" toolchain that was already available. Typed some methods "int rola_init" (dummy, sets some static initialized variable to 1), "int rola_gimme" (returns 42) and "void rola_shutdown" (sets the initialized variable to 0).
1. I forgot to mention it in the above but Lazarus and other IDEs already have this anyway and it seems Eclipse CDT also has it, except it doesn't work: i tried to have the IDE generate the bodies for these functions in a C file (that didn't exist yet) using the "Implement methods" command that seemed the most appropriate (and i couldn't find anything else anyway) but that didn't work. I thought it was because there wasn't a C file so i made an empty one with the same name as the header file but again it didn't work - even after adding an #include in the C file for the header file it didn't seem to match the two. So i typed these by hand even though i believe it should either use the C file with the same name as the H file (a common use) or at least ask me.
2. I made a C program with managed C project and added a new "main.c" file to it. I typed "rol" and pressed ctrl+space to see any suggestions and there were none, so it basically failed #2 and #28 above. I typed the code manually, used printf to print out the return value of "rola_gimme" and even after saving there were no errors or warnings at all even though the C file had no include files at all.
3. Tried to compile and as expected, it failed. There were no quick-fixes or anything else i could do from inside the IDE - there was an "info" message that i should include stdio.h to get the printf definition but the IDE wouldn't help there by adding it itself, i had to manually type the code. And TBH most likely that message came from the compiler and the IDE was oblivious to it anyway. Obviously no message about which file to include to get the rola_init, rola_gimme and rola_shutdown definitions, let alone doing those for me.
I lost interest at that point because it not only was unstable but also failed at the first thing i tried that would show the IDE really understood the source code. Note that this whole "automatically add header files" isn't even something i came up with, i remember a trial version of C++ Builder i tried years ago to do that and while i didn't check to see if it only does it for the header files that come with it or also for your own libraries, the latter would be an obvious thing to do anyway as the library was already part of the workspace and thus known to the IDE - and Eclipse didn't do either anyway.
But just in case, i tried to at least try the debugger so i thought to add the reference manually - which i did but Eclipse crashed every time i pressed the "Apply and close" button. However restarting it seemed to have the setting applied anyway so i could at least try the debugger. And at the end i couldn't figure out how to convince Eclipse to use the shared library project next to the program project, no matter what i tried (i'm sure there is a way but IMO all i should have to do is, as i wrote in #26, check the library's name in a listbox with all the available libraries - and FWIW there was such a thing but it did absolutely nothing, Eclipse only started realizing there is a library somewhere when i started adding in paths, etc, manually but i failed to make it build).
So at least i wrote a "int foo() { return 42; }" (in more than one line :-P) in main.c and then have an endless loop in "main" and run the program under the debugger. The program wrote a bunch of "42"s in the stdout so i put a breakpoint in "return 42;" and modified it to "return 48;" - then continued and... nothing happened, it kept outputing "42". I tried to rebuild the "current source file" and even "rebuild all" but it didn't change, i had to restart the program, thus failing (as far as i can tell) #11.
On a semi-positive side i made a "int lala(int x, int y) { return x*y; }" and the debugger was able to run this function, but then when i tried it with something a little more practical like implementing a very simple strlen "int lala(char* s){ int l = 0; for (;*s;++s,++l); return l; }" it failed with some weird errors.
Well I missed that. No you can't modify running code in C and hope it's going to end well unless your C program is carefully designed to allow that.
You'll have to set paths on the installation or project so it knows where the relevant libraries and headers are. You won't configure it all correctly in the first week.
If you do give it a go, use a makefile project. If you're using something else to build, just have the call to that in the Makefile and nothing much else. Maybe it does cmake etc now? Haven't tried. I only use it occasionally nowadays. Brilliant for any refactor.
You have to want it to succeed and do some work to make it function the way you want. It does work if you care to put some time into it when you're /learning/ how it all works. I did, works great for me but isn't my nirvana. Just another useful tool.
>So, eh, i don't think Eclipse CDT is it :-P.
Don't confuse, "I didn't get it to work first time with very little effort" "does not work" Also note that like any complex tool, once you've worked it out, which takes time, you don't have to do that again. Like the people who say vi is garbage because you can't quit.
If you don't spend the time and give up early, that's fine too and shows you how much you do or don't want these things and /any/ answer there is by definition correct.
Edit: Editing a post above a response with wholly new info is a pain, don't do that. Just hit reply.
> Don't confuse, "I didn't get it to work first time with very little effort" "does not work" Also note that like any complex tool, once you've worked it out, which takes time, you don't have to do that again.
I don't confuse the two, the program didn't do what i explicitly wrote in my post. If you think it can do what i asked, please explain how, because right now from what i can see it fails to do what i want from it. I didn't try everything i mentioned because it failed at pretty much everything i tried from the very first thing, so it didn't give me any confidence to keep on trying.
Also you seem to misunderstand something important even from my initial post: almost everything i wrote can be done by stringing together various tools and/or have various workaround, even the "modify code while it runs" could be done by using one of the libraries or tools mentioned elsewhere.
But the point is having the IDE actually do all that in a single place and with good UX (for example i didn't mentioned the part about checking a library's name in a listbox of libraries in a project's settings for fun, i mentioned because i expect at least that sort of user experience and convenience for the user! Eclipse CDE fails at that part because it needs all filling all sorts of forms in various places to see the library - my requirement wont be met by ignoring the requirement, the entire point of it was to request good user experience).
It is all about having a good user experience, if the program fails at that, it fails at the core of what i asked.
> Edit: Editing a post above a response with wholly new info is a pain, don't do that. Just hit reply.
When i edited the post there wasn't any reply, you replied while i was typing the edit.
>It is all about having a good user experience, if the program fails at that, it fails at the core of what i asked.
You don't want what you said you wanted because you won't do the work to get it. It's not even that much work tbh. That's fine. It does work for me and the "user experience" is fine. I'm not associated with the project, nor pushing anything. You can pretend it's because I'm so much smarter or this is my con or something else to explain that but I doubt these lines of reasoning.
> Another words: hot code reloading / swapping [1].
Indeed, though without the use of external libraries, be for C and integrated seamlessly into the IDE - and it needs to work on Linux since that is what i'm using :-) (i've used MSVC's edit-and-run or whatever is called at the past though it was kinda finicky if it worked or not).
You seem to know what you want. Have you actively looked for an IDE to use with C? Why don't you think any of the available options is better than your current setup?
I don't know of any IDE that provides even half of what i want TBH.
On Linux (which is my main OS these days) pretty much all options involve a text editor with some plugin/addon to somehow understand C plus the ability to call a makefile or some other command. Of all those Kate (KDE's "advanced" text editor) with an LSP plugin and a Clang-based LSP seems to be good enough.
Though it is really more of a "least bad" than "actually good" situation.
> I don't know of any IDE that provides even half of what i want TBH.
> On Linux (which is my main OS these days) pretty much all options involve a text editor
You obviously haven't looked hard enough.
CLion fulfills a decent amount of what you're looking for.
https://www.jetbrains.com/clion/
A lot more limited, but still much more capable as an IDE than text editors is KDevelop, for example your request here :
> (i haven't touched topics like VCS support and how i'd like to be able to see and use different version of the code from inside the IDE - like e.g. go back in time to a different function while the debugger is running - or anything that has to do with GUIs)
> An especially useful feature is the Annotate border, which shows who last changed a line and when. Showing the diff which introduced this change is just one click away!
Also example snippet of the debugging integration :
> You can also hover the mouse over a symbol in your code, e.g. a variable; KDevelop will then show the current value of that symbol and offer to stop the program during execution the next time this variable's value changes.
> You obviously haven't looked hard enough. CLion fulfills a decent amount of what you're looking for. https://www.jetbrains.com/clion/
CLion has the problem of being a proprietary program that requires online validation, which is a big hard no for me.
Also IMO the fact that you point out KDevelop being able to show a per-line commit and the current value of a variable, both being among the minimum you can expect from an IDE tell me you didn't read what i wrote that i wanted, so by extension i doubt CLion also does anything close to what i wrote.
I don't "just" expect "some" debugger integration or "some" VCS integration, i explicitly wrote things like the debugger being able to call a function in the running program or modify a function while the program is called or being able to replace the current function with an older version of the function taken out of VCS. Among a ton of other things.
What you show KDevelop to do aren't anything special, even non-IDE "programmers' text editors" can do them.
You can still try CLion (the trial version) and see if it’s what you’re after. You don’t have to use it but IMHO complaining so much about there not being a decent IDE without even trying the proprietary ones isn’t very fruitful. CLion is what Borland was back in the 90s.
The thing is even if CLion does what i want (TBH i doubt it[0]), i wouldn't use it anyway so i don't see a reason to spend money on it. Note that my issue wasn't so much that it was proprietary (though it is an issue[0]) but that it requires an internet connection to function.
After all i still have and can use Borland C++ 5, Delphi 2 and C++ Builder 1 to this day without requiring any sort of connection or having Borland's permission to use the software i bought. I can't do the same with CLion.
[0] CLion relies a lot more than Borland on external tools like GCC, CMake, GDB, etc meaning that not only it most likely does not provide all the integrated functionality i mentioned but there is also a very high chance it will stop working at some point as its dependencies are changing so you do need to rely on JetBrains to keep it up to date without having access to the source code.
Yes, though i don't remember why i decided against KDevelop, i remember installing it at least a couple of times, finding some annoyance and removing it. I do remember liking QtCreator more but that was in comparison to KDevelop.
> ...a Makefile and vim (or emacs, or even nano, I'm not going to judge your kink) are fine. If they are not fine, then C is probably not the right language for the project.
Sorry buddy, you might believe Makefiles are fine only if you are not aware of the most basic requirements of a build system. CMake does stuff like running sanity checks on libraries, configure them for you with minimal effort, and even add platform-specific configuration easily. Did you know that cmake started as a Makefile generator? Why do you think people need that?
Makefiles alone were never enough, as the development of tools such as the autotools family demonstrated decades ago. Claiming otherwise just seems naive flexing from someone who has no real world experience whatsoever.
> Did you know that cmake started as a Makefile generator? Why do you think people need that?
I like make myself, but I’m honest enough to acknowledge that the whole autotools suite (autoconf/automake) was born to, essentially, generate makefiles.
Which is not 100% make’s complexity’s fault though… the toolchains have their own complexity (even more so when a project must build across platforms)…
...a Makefile and vim (or emacs, or even nano, I'm not going to judge your kink) are fine. If they are not fine, then C is probably not the right language for the project.