Write a C program that won’t compile in C++

Although C++ is designed to have backward compatibility with C there can be many C programs that would produce compiler error when compiled with a C++ compiler. Following are some of them.

1) In C++, it is a compiler error to call a function before it is declared. But in C, it may compile (See https://www.geeksforgeeks.org/g-fact-95/)

filter_none

edit
close

play_arrow

link
brightness_4
code

#include<stdio.h>
int main()
{
   foo(); // foo() is called before its declaration/definition
  
int foo()
{
   printf("Hello");
   return 0; 
}

chevron_right





2) In C++, it is compiler error to make a normal pointer to point a const variable, but it is allowed in C. (See Const Qualifier in C)

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <stdio.h>
  
int main(void)
{
    int const j = 20;
  
    /* The below assignment is invalid in C++, results in error
       In C, the compiler *may* throw a warning, but casting is
       implicitly allowed */
    int *ptr = &j;  // A normal pointer points to const
  
    printf("*ptr: %d\n", *ptr);
  
    return 0;
}

chevron_right



3) In C, a void pointer can directly be assigned to some other pointer like int *, char *. But in C++, a void pointer must be explicitly typcasted.

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <stdio.h>
int main()
{
   void *vptr;
   int *iptr = vptr; //In C++, it must be replaced with int *iptr=(int *)vptr; 
   return 0;
}

chevron_right


This is something we notice when we use malloc(). Return type of malloc() is void *. In C++, we must explicitly typecast return value of malloc() to appropriate type, e.g., “int *p = (int *)malloc(sizeof(int))”. In C, typecasting is not necessary.





4) Following program compiles & runs fine in C, but fails in compilation in C++. const variable in C++ must be initialized but in c it isn’t necessary. Thanks to Pravasi Meet for suggesting this point.

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <stdio.h>
int main()
{
    const int a;   // LINE 4
    return 0;
}

chevron_right


Line 4 [Error] uninitialized const 'a' [-fpermissive]



5) This is the worst answer among all, but still a valid answer. We can use one of the C++ specific keywords as variable names. The program won’t compile in C++, but would compiler in C.

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <stdio.h>
int main(void)
{
    int new = 5;  // new is a keyword in C++, but not in C
    printf("%d", new);
}

chevron_right


Similarly, we can use other keywords like delete, explicit, class, .. etc.

6) C++ does more strict type checking than C. For example the following program compiles in C, but not in C++. In C++, we get compiler error “invalid conversion from ‘int’ to ‘char*'”. Thanks to Pravasi Meet for adding this point.

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <stdio.h>
int main()
{
    char *c = 333;
    printf("c = %u", c);
    return 0;
}

chevron_right


7) C++ require main return ‘int’ type

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <stdio.h>
void main()
{
    printf("Hello World");
}

chevron_right


8) A C/C++ Function Call Puzzle
This article is contributed by Abhay Rathi. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above



My Personal Notes arrow_drop_up

Improved By : Sreedhar25, makristiniy



Article Tags :
Practice Tags :


2


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.