Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
788 views
in Technique[技术] by (71.8m points)

c - Declaring a global variable `extern const int` in header but only `int` in source file

I was experimenting with GCC and found out that you can declare external variables const in header files but keep them mutable in implementation files.

EDIT: This does actually not work. The only reason I got my test code to compile was because I did not include "header.h" in "header.c".

header.h:

#ifndef HEADER_H_
#define HEADER_H_

extern const int global_variable;

#endif

header.c:

int global_variable = 17;

This seems like a very good feature to use for keeping global_variable readonly to the users of header.h but keeping them modifable by the implementation (header.c).

NOTE: The following code is just an example on how this way of declaring will prevent assignment to global_variable.

#include "header.h"

int main(void)
{
    global_variable = 34; /* This is an error as `global_variable` is declared const */
    return 0;
}

Because I have never seen technique in practise before. I start to wonder if it is valid.

Is this well defined behaivor or is this an error that GCC fails to warn me about?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

const int and int are not compatible types.

For example this:

extern const int a;

int a = 2;

is not valid in C as C says that:

(C11, 6.7p4) "All declarations in the same scope that refer to the same object or function shall specify compatible types"

In your case they are not in the same scope (different translation units) but C also says that:

(C11, 6.2.7p2) "All declarations that refer to the same object or function shall have compatible type; otherwise, the behavior is undefined."

As you are violating the rule above, you are invoking undefined behavior.

Note that C90 has the same paragraphs.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...