Это похоже на (но отличается от) этот вопрос .
Вот простой тестовый код, иллюстрирующий некоторые странности, которые я обнаружил в Sun CC:
//---------------main.cpp
#include "wtc.hpp"
int main(int, char**)
{
testy t;
t.lame(99);
return 0;
}
//--------------wtc.hpp
#ifndef WTC_HPP_INCLUDED
#define WTC_HPP_INCLUDED
class testy
{
public:
void lame(int );
};
#endif
//---------------wtc.cpp
#include <iostream>
#include "wtc.hpp"
void testy::lame(const int a)
{
std::cout << "I was passed " << a << "\n";
}
//---------------makefile
#CXX=CC
CXX =g++
#CXXFLAGS= -g
CXXFLAGS= -g3 -Wall -Werror
OBJECTS=$(patsubst %.cpp,%.o,$(wildcard *.cpp))
all : $(OBJECTS)
$(CXX) $(CXXFLAGS) -o $@ $^
.PHONY: clean
clean :
rm *.o
Когда это было скомпилировано с использованием g ++, оно компилирует, связывает и делает то, что вы ожидаете при запуске.
Вы также можете добавить ++ a; в testy :: lame () и компилятор будет жаловаться на изменение переменной только для чтения (как и должно быть).
Однако, когда я компилирую с использованием CC, я получаю следующую ошибку компоновщика:
CC -g -c -o main.o main.cpp
CC -g -c -o wtc.o wtc.cpp
CC -g -o all main.o wtc.o
Undefined first referenced
symbol in file
void testy::lame(int) main.o
ld: fatal: Symbol referencing errors. No output written to all
make: *** [all] Error 1
проверяя объектный код с помощью nm и C ++ фильтром, я обнаружил, что версия g ++ создает
символ testy :: lame (int), тогда как CC создает testy :: lame (const int), следовательно, ошибка компоновщика.
Я посмотрел его в книге Страуструпа, но не могу найти упомянутую технику (это не значит, что ее там нет!); так это действительно ошибка компилятора, или просто взлом, который работает везде, кроме Solaris?