これは、この質問に似ています (ただし、異なります) 。
以下は、私が 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++filt でオブジェクト コードをチェックすると、g++ バージョンでは testy::lame(int) シンボルが作成されるのに対し、CC では testy::lame(const int) が作成されるため、リンカー エラーが発生することがわかりました。
私は Stroustrup の本でそれを調べましたが、このテクニックが言及されているのを見つけることができません (それが存在しないという意味ではありません!)。これは本当にコンパイラのバグなのか、それとも Solaris 以外のどこでも機能する単なるハックなのか?