アカウント名:
パスワード:
#define private public
#include "hoge/hoge.h"
これで秘匿関数呼びたいホーダイ。
ちなみに、少し前からVisual C++には#define private public対策が入っています。
#define private public#include <iostream>
これをコンパイルすると、このようにコンパイルエラーとなります。
T:\>cl /c hoge.cppMicrosoft(R) C/C++ Optimizing Compiler Version 19.00.23026 for x86Copyright (C) Microsoft Corporation. All rights reserved. hoge.cppC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xkeycheck.h(214): warning C4005: 'private': マクロが再定義されました。hoge.cpp(1): note: 'private' の以前の定義を確認してくださいC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\INCLUDE\xkeycheck.h(250): fatal error C1189: #error: The C++ Standard Library forbids macroizing keywords. Enable warning C4005 to find the forbidden macro.
まあ、ヘッダーでの対処なので、インクルードよりあとに#define private publicすると回避できるのですが。
最新の Visual C++ は確認できる環境が身近にないのですが、ちょっと古い Visual C++ 2010 Expressだと、マクロ_XKEYCHECK とか RC_INVOKED を定義すれば回避できますね。
マクロなら、OKだけど、関数は無理。 (C/C++)リンク時に相手がいない。
hoge.h: class hoge {private: void piyo();public: void hogera();}; hoge.cpp: #include "hoge.h"#include <iostream>using namespace std;
void hoge::piyo(){ cout << "piyo" << endl;}void hoge::hogera(){ cout << "hogera" << endl;} main.cpp: #define private public#include "hoge.h"
int main(){ hoge hoge; hoge.piyo();
リンク時に相手がいない。
どゆ意味?
たぶん、publicとかprivateが関数名のマングル規則に埋め込まれてると勘違いしたんじゃないの?
Visual C++ 2010 Express で確認した限りでは、private: void hoge::piyo() → ?piyo@hoge@@AAEXXZpublic: void hoge::piyo() → ?piyo@hoge@@QAEXXZなので g++ とは規則が違うようです。
このハックってたまに聞くけど、バイナリ互換性って壊れないの?
そもそもprivateな関数を呼ばざるを得ない状況を作り出したクラス設計がマズいのでは。
テスト用コードを作るとき、時々やるかなー隠蔽されている部分のテストは、 めんどくさいときがある。
Javaだとprivateにしたらテストに困るのでパッケージアクセスにしたくなることがありますね。
そんなもん元コメで充分わかってるうえで、オブジェクトやリンカレベルの話をしてるのかなーと。
C++であれば、publicやらprivateやらは、コンパイラがエラーを出すか出さないかのヒント以上の意味はないので、どこにどのようにつけてもバイナリは変らないはず。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
物事のやり方は一つではない -- Perlな人
#defineがあれば、何でも出来る (スコア:1)
#define private public
#include "hoge/hoge.h"
これで秘匿関数呼びたいホーダイ。
Re:#defineがあれば、何でも出来る (スコア:3, 参考になる)
ちなみに、少し前からVisual C++には#define private public対策が入っています。
これをコンパイルすると、このようにコンパイルエラーとなります。
まあ、ヘッダーでの対処なので、インクルードよりあとに#define private publicすると回避できるのですが。
Re: (スコア:0)
最新の Visual C++ は確認できる環境が身近にないのですが、ちょっと古い Visual C++ 2010 Expressだと、マクロ_XKEYCHECK とか RC_INVOKED を定義すれば回避できますね。
Re:#defineがあれば、何でも出来る (スコア:2)
マクロなら、OKだけど、関数は無理。 (C/C++)
リンク時に相手がいない。
Re: (スコア:0)
hoge.h:
class hoge {
private:
void piyo();
public:
void hogera();
};
hoge.cpp:
#include "hoge.h"
#include <iostream>
using namespace std;
void hoge::piyo()
{
cout << "piyo" << endl;
}
void hoge::hogera()
{
cout << "hogera" << endl;
}
main.cpp:
#define private public
#include "hoge.h"
int main()
{
hoge hoge;
hoge.piyo();
Re: (スコア:0)
どゆ意味?
Re: (スコア:0)
たぶん、publicとかprivateが関数名のマングル規則に埋め込まれてると勘違いしたんじゃないの?
Re: (スコア:0)
Visual C++ 2010 Express で確認した限りでは、
private: void hoge::piyo() → ?piyo@hoge@@AAEXXZ
public: void hoge::piyo() → ?piyo@hoge@@QAEXXZ
なので g++ とは規則が違うようです。
Re: (スコア:0)
このハックってたまに聞くけど、バイナリ互換性って壊れないの?
Re: (スコア:0)
そもそもprivateな関数を呼ばざるを得ない状況を作り出したクラス設計がマズいのでは。
Re: (スコア:0)
テスト用コードを作るとき、時々やるかなー
隠蔽されている部分のテストは、 めんどくさいときがある。
Re: (スコア:0)
Javaだとprivateにしたらテストに困るのでパッケージアクセスにしたくなることがありますね。
Re:#defineがあれば、何でも出来る (スコア:1)
まあ、それも善し悪しではありますが。
-- To be sincere...
Re: (スコア:0)
そんなもん元コメで充分わかってるうえで、オブジェクトやリンカレベルの話をしてるのかなーと。
Re: (スコア:0)
C++であれば、publicやらprivateやらは、コンパイラがエラーを出すか出さないかのヒント以上の意味はないので、どこにどのようにつけてもバイナリは変らないはず。