9 ms·
You'd think the compiler would let you know you have a constant that is not labelled as such, like the way `tslint` complains about this incessantly. (I think `
by SavantIdiot 5y ago
You'd think the compiler would let you know you have a constant that is not labelled as such, like the way `tslint` complains about this incessantly. (I think `splint` for c/c++ may also do this, but I've only briefly used it.)
- ericbarrett 5y agoThe compiler only operates on one unit (file) at a time so it has literally no way of telling this in C. There are legitimate uses for having a non-const global which is never modified by local source: library config options, hooks for external programs, and what not. As you say, this would be a job for the linter.
- astrange 5y agoYou can get pretty far with a compiler warning like "warn if a global isn't preceded by an 'extern' declaration". Also, LTO does have enough information to warn about these things, especially with default hidden visibility.
- ericbarrett 5y agoThe global must be declared without "extern" somewhere or else no memory is allocated for it. LTO could handle this if you're compiling an executable, but not a library.
- astrange 5y ago> LTO could handle this if you're compiling an executable, but not a library. That's not the correct distinction, that's why I said default vs hidden visibility. Libraries typically export more symbols but executables can also export them eg for plugins.