Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Forcing compiler to C99 standard

Tags:

c

gcc

clang

c99

c11

I was coding on my project when I discovered that the anonymous structs I've been using for a while are actually only available in C11, not C99, the standard I want to code against.

Given the following code:

struct data {
    int a;
    struct {
        int b;
        int c;
    };
};

int main()
{
    struct data d;

    d.a = 0;
    d.b = 1;
    d.c = 2;
    return 0;
}

This code should only compile in C11 (or if compiler extensions provide this feature and are enabled). So let's see the results on different compilers:

clang 5

compiler:
    Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
    Target: x86_64-apple-darwin13.1.0
    Thread model: posix
command: 
    clang -std=c99 -Wall test.c -o test
result: 
    **OK**

gcc 4.1

compiler:
    gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
command: 
    gcc -std=c99 -Wall test.c -o test
result: 
    **NOT OK**
    test.c:6: warning: declaration does not declare anything
    test.c: In function 'main':
    test.c:14: error: 'struct data' has no member named 'b'
    test.c:15: error: 'struct data' has no member named 'c'

gcc 4.7

compiler:
    gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
command: 
    gcc -std=c99 -Wall test.c -o test
result: 
    **OK**
    test.c: In function 'main':
    test.c:11:14: warning: variable 'd' set but not used [-Wunused-but-set-variable]

I've always tried to force the compiler to C99 mode by specifying -std=c99, but obviously this doesn't work (except for gcc 4.1 which compiles fine without the -std parameter). So my question is now, how can I force the compilers gcc and clang, in any version, to issue an error if I write code that does not conform to the standard I specify using -std? Is there some command line argument that I don't know of?

like image 682
grasbueschel Avatar asked Mar 09 '14 16:03

grasbueschel


People also ask

What is STD C99?

C99 is a C language standard - http://en.wikipedia.org/wiki/C99[^] By setting the flag std=C99 you invoke GCC in a C99 compilant mode... By default GCC does not conform to any standard (but enables all GNU specific extensions), so if you want to compile some standard code you have to set it...


2 Answers

-std=c99 won't disable language extensions (GNU C has anon structs in C99).

The -pedantic (or -pedantic-errors) flags make the compiler warn on language extensions.

like image 61
MBlanc Avatar answered Oct 09 '22 05:10

MBlanc


Both gcc and clang allow a large number of extension and here for clang. clang in general attempts to support most of the extensions that gcc does. Both will even allow you to use features that are C only in C++ for example VLAs which are a C99 feature.

In this case both are allowing you to use Unnamed struct/union fields within structs/unions in C99 mode even though it is a C11 feature.

The Language Standards Supported by GCC documents well what flags are required to turn these into warnings and errors and as far as I know clang follows the same conventions:

[...]to obtain all the diagnostics required by the standard, you should also specify -pedantic (or -pedantic-errors if you want them to be errors rather than warnings). [...]

So -pedantic will warn you if you are using an extension and -pedantic-errors will turn these warnings into an error. With -pedantic flag you should see a warning like this in gcc:

warning: ISO C99 doesn't support unnamed structs/unions [-Wpedantic]

and this in clang (see it live):

warning: anonymous structs are a C11 extension [-Wc11-extensions]

and it turn into an error with -pedantic-errors.

like image 44
Shafik Yaghmour Avatar answered Oct 09 '22 05:10

Shafik Yaghmour