6

I was reading this. The first answer by @Andrei T says that

A "large" object is never a constant expression in C, even if the object is declared as const. Const-qualified objects (of any type) are not constants in C language terminology. They cannot be used in initializers of objects with static storage duration, regardless of their type.

For example, this is NOT a constant

const int N = 5; /* `N` is not a constant in C */

The above N would be a constant in C++, but it is not a constant in C. So, if you try doing

static int j = N; /* ERROR */

you will get the same error: an attempt to initialize a static object with a non-constant

I agree with his answer. I also tried a simple example like following on gcc 4.8.2 & 4.9.2 & it gives compiler errors as I expected:

#include <stdio.h>
int main(void)
{
 const int a=5;
 static int b=a;
 printf("%d",b);
}

But When I tried it on ideone.com it compiles & runs fine and gives expected outcome. See live demo here. Also, on codeblocks 13.12 IDE (gcc 4.7.1) this program runs fine. So, Is it compiler bug or gcc extension? What combination of compiler options ideone uses under the hood? So, how & why it compiles in ideone? What is the reason?

asked Jun 21, 2015 at 8:13
1

2 Answers 2

4

It's because the ideone likely invokes gcc with -O option (optimization level 1). This is the case even for older versions of gcc (mine is 4.4.7):

$ gcc -ansi main.c 
main.c: In function ‘main’:
main.c:6: error: initializer element is not constant
$ gcc -ansi -O main.c
$ echo $?
0

What's interesting here is that with -pedantic it is working properly again and required diagnostic message is present (tested only with 4.4.7, see Keith's comment ):

gcc -ansi -pedantic -O main.c 
main.c: In function ‘main’:
main.c:6: error: initializer element is not constant
$ echo $?
1
answered Jun 21, 2015 at 9:14
Sign up to request clarification or add additional context in comments.

2 Comments

I can confirm this behavior on my own system; -O (or -O1, -O2, -O3) causes gcc not to diagnose the error. That's a bug in gcc. The use of a non-constant expression to initialize a static object is a constraint violation, requiring a diagnostic. That diagnostic may be a non-fatal warning, but some diagnostic message is mandatory. And I don't see the error with gcc -ansi -pedantic -O main.c (gcc 4.8.4).
And gcc's behavior is inconsistent. It permits the use of a as an initializer for a static object, but not in a case label.
3

This seems to be a gcc speciality. Compiling with -std=c89 or -pedantic reports the error.

Since in all C standards this is a constraint violation, not giving a diagnostic for that case makes gcc without one of the -std=c?? options a non-conforming compiler.

answered Jun 21, 2015 at 8:30

7 Comments

Mentioning that extension would be helpful.
I can't find a set of options that causes gcc not to report an error (versions 4.1.2 and 4.8.4).
I searched GCC C-extensions list and found nothing regarding this.
@haccks, it doesn't seem that they document this in the place that you would expect. And actually since this in C this a constraint violation, this isn't even an extension but makes the gcc compiler without specifying one of the standards non-conforming.
I've submitted a gcc bug report: gcc.gnu.org/bugzilla/show_bug.cgi?id=66618
|

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.