Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated

Tags:

c++

clang

What does this clang++ error message mean, and why am I getting it? I can't seem to find anything on the internet about it...
clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated

Here's my code,

MergeSort.h:

#ifndef __MERGESORT_H__ #define __MERGESORT_H__  #include <iostream> using namespace std;  class MergeSort;  class MergeSort {     public:      MergeSort();     MergeSort(const int* list, int length);     ~MergeSort();      friend ostream& operator<< (ostream& os, const MergeSort& ms);      private:      int* list;     int len; };  ostream& operator<< (ostream& os, const MergeSort& ms); #endif 

MergeSort.cpp:

#include <iostream> #include "MergeSort.h"  using namespace std;  MergeSort::MergeSort() {     list = new int[1];     list[0] = 0;     len = 0; }  MergeSort::MergeSort (const int* t, int length) {     if (t) {         len = length;         list = new int[len];         for (int i = 0; i < length; i++)             list[i] = t[i];     }     else {         list = new int[1];         list[0] = 0;         len = 0;     } }  MergeSort::~MergeSort() {     delete[] list; }  ostream& operator<<(ostream& os, const MergeSort& ms) {     for (int i = 0; i < ms.len; i++)         os << ms.list[i];     return os; }   int main() {     int list[] = {1,2,3,4};     int list_len = sizeof(list)/sizeof(int);     MergeSort ms = MergeSort(list, list_len);     cout << ms << endl;     cout << "hello world" << endl; } 

And the output:

[gyeh@gyeh mergesort]$ clang++ -c -g -Wall MergeSort.cpp MergeSort.h clang: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated [gyeh@gyeh mergesort]$ clang++ MergeSort.o -o MergeSort [gyeh@gyeh mergesort]$ valgrind --leak-check=yes ./MergeSort ==25774== Memcheck, a memory error detector ==25774== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. ==25774== Using Valgrind-3.9.0 and LibVEX; rerun with -h for copyright info ==25774== Command: ./MergeSort ==25774==  1234 hello world ==25774==  ==25774== HEAP SUMMARY: ==25774==     in use at exit: 0 bytes in 0 blocks ==25774==   total heap usage: 1 allocs, 1 frees, 16 bytes allocated ==25774==  ==25774== All heap blocks were freed -- no leaks are possible ==25774==  ==25774== For counts of detected and suppressed errors, rerun with: -v ==25774== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 1 from 1) 
like image 417
antimatter Avatar asked May 08 '14 06:05

antimatter


2 Answers

You should not compile the header files, only the source files.

like image 100
Some programmer dude Avatar answered Sep 19 '22 20:09

Some programmer dude


Inspire from @JoachimPileborg. The actually meaning of this error message tells is:

You're compiling an C header file via a CXX compiler. It DOES NOT mean you CAN NOT compile the header files. you CAN compile the header file if you choose the right compiler for the right files. In simple words:

clang   with *.h    works clang   with *.hpp  not works clang++ with *.h    not works clang++ with *.hpp  works 

So to fix the issue about compiling the header files, for example the pre-compile headers, just change the suffix from .h to .hpp will do the trick.

like image 34
jayatubi Avatar answered Sep 19 '22 20:09

jayatubi