насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 10:04
Оценка: :))) :)))
я никаких пунктов стандарта не нарушаю?


#define class struct
#define protected public
#define private public

#include "imported.h"

#undef class 
#undef protected 
#undef private
~~~~~
~lol~~
~~~ Single Password Solution
Re: насколько такая "наглость" работоспособна?
От: Sash_xp  
Дата: 29.11.09 10:07
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>я никаких пунктов стандарта не нарушаю?



C>
C>#define class struct
C>#define protected public
C>#define private public

C>#include "imported.h"

C>#undef class 
C>#undef protected 
C>#undef private 
C>


Считается плохой практикой переопределять ключевые слова. Проблем можно огрести по самое не горюй.

PS Это ведь шутка, да?
Re[2]: насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 10:12
Оценка:
Здравствуйте, Sash_xp, Вы писали:


S_>PS Это ведь шутка, да?


в работе я такое не использую, а вот эксперимент поставил... И все работает корректно
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: насколько такая "наглость" работоспособна?
От: little_alex  
Дата: 29.11.09 10:15
Оценка: +1
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, Sash_xp, Вы писали:



S_>>PS Это ведь шутка, да?


C>в работе я такое не использую, а вот эксперимент поставил... И все работает корректно


В некоторых случаях будет ошибка линковки — имя "struct A" и имя "class A" по разному может декорироваться компилятором.
Re: насколько такая "наглость" работоспособна?
От: ononim  
Дата: 29.11.09 10:18
Оценка: +4 :)
воистину безгранична фантазия любителей прострелить себе ногу
Как много веселых ребят, и все делают велосипед...
Re[4]: насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 10:21
Оценка:
Здравствуйте, little_alex, Вы писали:

_>Здравствуйте, Caracrist, Вы писали:


C>>Здравствуйте, Sash_xp, Вы писали:



S_>>>PS Это ведь шутка, да?


C>>в работе я такое не использую, а вот эксперимент поставил... И все работает корректно


_>В некоторых случаях будет ошибка линковки — имя "struct A" и имя "class A" по разному может декорироваться компилятором.



да точно...
template<class A> ...

однако, как раз это переопределения не важно.
~~~~~
~lol~~
~~~ Single Password Solution
Re: насколько такая "наглость" работоспособна?
От: Юрий Жмеренецкий ICQ 380412032
Дата: 29.11.09 10:24
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>я никаких пунктов стандарта не нарушаю?



C>
C>#define class struct
C>#define protected public
C>#define private public

C>#include "imported.h"

C>#undef class 
C>#undef protected 
C>#undef private 
C>


Ответ зависит от содержания "imported.h". Если в нем используется директива препроцессора 'include' для C++ Standard Library header, то будет нарушен 17.4.3.1.1 (если не предпринимать дополнительных мер):

A translation unit that includes a header shall not contain any macros that define names declared or defined in that header. Nor shall such a translation unit define macros for names lexically identical to keywords.

Re[5]: насколько такая "наглость" работоспособна?
От: little_alex  
Дата: 29.11.09 10:26
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, little_alex, Вы писали:



_>>В некоторых случаях будет ошибка линковки — имя "struct A" и имя "class A" по разному может декорироваться компилятором.



C>да точно...

C>
C>template<class A> ...
C>

C>однако, как раз это переопределения не важно.

Не только. Может получится разное имя даже в банальных случаях struct A{}; class A{}; и public: a(); protected: a();
Кажется VC так делает.
Re[6]: насколько такая "наглость" работоспособна?
От: little_alex  
Дата: 29.11.09 10:30
Оценка:
Здравствуйте, little_alex, Вы писали:

_>Кажется VC так делает.

http://labs.trolltech.com/blogs/2009/08/12/some-thoughts-on-binary-compatibility/
Re: насколько такая "наглость" работоспособна?
От: Sergey Chadov Россия  
Дата: 29.11.09 10:43
Оценка: 1 (1) :))) :))) :))) :))
Здравствуйте, Caracrist, Вы писали:

C>
C>#define class struct
C>#define protected public
C>#define private public

C>#include "imported.h"

C>#undef class 
C>#undef protected 
C>#undef private 
C>


так можно испортить себе карму и в следующей жизни стать баобабом.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 10:43
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:



ЮЖ>Ответ зависит от содержания "imported.h". Если в нем используется директива препроцессора 'include' для C++ Standard Library header, то будет нарушен 17.4.3.1.1 (если не предпринимать дополнительных мер):


ЮЖ>

A translation unit that includes a header shall not contain any macros that define names declared or defined in that header. Nor shall such a translation unit define macros for names lexically identical to keywords.


на самом деле, содержалась (для эксперимента), меры принял (заиклудил заранее) и всё заработало.
~~~~~
~lol~~
~~~ Single Password Solution
Re[7]: насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 10:49
Оценка:
Здравствуйте, little_alex, Вы писали:

_>Здравствуйте, little_alex, Вы писали:


_>>Кажется VC так делает.

_>http://labs.trolltech.com/blogs/2009/08/12/some-thoughts-on-binary-compatibility/

честно почитал, но проблему не нашел... ткните носом
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 10:51
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:


SC>так можно испортить себе карму и в следующей жизни стать баобабом.


а сколько головной боли потомкам уже в этой жизни ...
~~~~~
~lol~~
~~~ Single Password Solution
Re: насколько такая "наглость" работоспособна?
От: Тролль зеленый и толстый  
Дата: 29.11.09 10:57
Оценка:
Нормуль. Только в большинстве случаев разработчикам сиплюсплюсных библиотек приходится использовать уродскую идиому PImpl, которая делает такой финт бесполезным.
Re[8]: насколько такая "наглость" работоспособна?
От: little_alex  
Дата: 29.11.09 11:33
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>честно почитал, но проблему не нашел... ткните носом

Это может быть я что-то не понимаю.
Речь идет о том, что имена public и protected методов по-разному декорируются компилятором и если использовать improted.h в одном мести и "пропатченный" imported.h в другом, то они вместе не слинкуются
class MyClass
{
protected:
    // GCC mangling: _ZN7MyClass11doSomethingEv
    // MSVC mangling: ?doSomething@MyClass@@IAAXXZ
    void doSomething();
};

class MyClass
{
public:
    // GCC mangling: _ZN7MyClass11doSomethingEv (unchanged)
    // MSVC mangling: ?doSomething@MyClass@@QAAXXZ
    void doSomething();
};
Re[9]: насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 11:55
Оценка:
Здравствуйте, little_alex, Вы писали:

_>Здравствуйте, Caracrist, Вы писали:


C>>честно почитал, но проблему не нашел... ткните носом

_>Это может быть я что-то не понимаю.
_>Речь идет о том, что имена public и protected методов по-разному декорируются компилятором и если использовать improted.h в одном мести и "пропатченный" imported.h в другом, то они вместе не слинкуются
_>
_>class MyClass
_>{
_>protected:
_>    // GCC mangling: _ZN7MyClass11doSomethingEv
_>    // MSVC mangling: ?doSomething@MyClass@@IAAXXZ
_>    void doSomething();
_>};

_>class MyClass
_>{
_>public:
_>    // GCC mangling: _ZN7MyClass11doSomethingEv (unchanged)
_>    // MSVC mangling: ?doSomething@MyClass@@QAAXXZ
_>    void doSomething();
_>};
_>


хмм... интересно
У меня на VS2008SP1 всё слинковалось...

Добавил:
#pragma comment(lib, "importedProject.lib")

Сразу после инклуда, и всё работает на ура.

Ваш пример теоретический или тестированный?
~~~~~
~lol~~
~~~ Single Password Solution
Re[2]: насколько такая "наглость" работоспособна?
От: rg45 СССР  
Дата: 29.11.09 12:18
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

ТЗИ>Нормуль. Только в большинстве случаев разработчикам сиплюсплюсных библиотек приходится использовать уродскую идиому PImpl, которая делает такой финт бесполезным.


Уродских идиом не бывает, бывает их уродское использование
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[10]: насколько такая "наглость" работоспособна?
От: little_alex  
Дата: 29.11.09 12:36
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Ваш пример теоретический или тестированный?

Теоретический
Доберусь до компилятора — проверю.
Re[10]: насколько такая "наглость" работоспособна?
От: little_alex  
Дата: 29.11.09 14:00
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, little_alex, Вы писали:


C>хмм... интересно

C>У меня на VS2008SP1 всё слинковалось...


C>Ваш пример теоретический или тестированный?


Проверил — действительно не линкуется.

Проект
1. a.h
class MyClass
{
protected:
    void doSomething();
};

2. a.cpp
#include "a.h"
#include <iostream>

void MyClass::doSomething()
{
    std::cout<<"It works!!!"<<std::endl;
}

3. b.cpp
#define protected public
#include "a.h"
#undef protected

int main()
{
    MyClass a;
    a.doSomething();
}

MSVC 2005:
1>b.obj : error LNK2019: unresolved external symbol "public: void __thiscall MyClass::doSomething(void)" (?doSomething@MyClass@@QAEXXZ) referenced in function _main
Re[11]: насколько такая "наглость" работоспособна?
От: Caracrist https://1pwd.org/
Дата: 29.11.09 14:09
Оценка:
Здравствуйте, little_alex, Вы писали:


>MSVC 2005:

походу в 2008 они сами себя перехитрили
b.obj : error LNK2019: unresolved external symbol "public: void __thiscall MyClass::doSomething(void)" (?doSomething@MyClass@@QAEXXZ) referenced in function _main
~~~~~
~lol~~
~~~ Single Password Solution
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.