C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[76034] Re: __fastcall 워닝. 이 또한 델파이 때문에 일어나는 문제
빌더(TWx) [builder] 1262 읽음    2021-02-05 09:46
김상면 님이 쓰신 글 :
: 제가 알기로는 멤버 함수는 thiscall호출 규약을 사용하는걸로 알고 있습니다.
: 근데 왜 이전 버전에서는 컴파일이 되었는지는 몰겠군요.
: 그럼
:
: 김시환 님이 쓰신 글 :
: : 예전에 만들어 놓은 클래스 라이브러리를 빌더 10.4.0 까지는 정상적으로 사용을 하고 있었습니다.
: : 그런데 10.4.1 로 버젼업을 하고 부터는 생성자 함수에 fastcall 이 붙어 있으면 전부 에러를 발생시키고 있습니다.
: :
: : class TestClass
: : {
: : public :
: :     __fastcall TestClass(int i, int j) ;    // 에러 발생
: :     __fastcall ~TestClass() ;            // 문제없음
: : };
: :
: : 그래서 모든 클래스의 생성자 함수에 있는 __fastcall 을 제거하면 정상적으로 컴파일이 됩니다.
: : CLang 컴파일러를 사용했을 경우 입니다.
: :
: : CLang에 무슨 기준이 변경된 것인가요? 아니면 제 코드에 어떤 문제가 있는 것일까요??




답변:


이 문제는 thiscall 콜링 컨벤션과 아무런 관련이 없는 거고. 근본적으로 델파이 때문에 일어나는 문제 입니다.


C++은 아래와 같이...

class A
{
public:
  A() = delete;
  ~A() = default;
};

옵티마이징을 위해서 위와 같은 식으로도 constructor와 destructor를 재정의 할 수 있는데
콜링 컨벤션이 무슨 의미가 있습니까.

C++에선 ctor와 dtor가 컴파일러 디폴트로 정의되어 있는 호출방식을 따를 뿐이고.



__fastcall 호출방식을 지정했을 때 컴파일 워닝이 나오는 것은...
후진 옵티마이징을 극복하기 위한 편법으로 델파이 컴파일러에서 디폴트 호출방식으로 __fastcall 을
사용하도록 강제하고 있기 때문 입니다.



__fastcall 로 인한 워닝을 피하는 방법은...

1.

class B : public TObject
{
public:
  __fastcall B(){}
  __fastcall ~B(){}
};

위와 같이 모든 C++클래스를 일일히 델파이 스타일 클래스로 부터 상속 받아서
델파이 클래스 시멘틱 룰에 종속되도록 하는 단무지 같은 방법을 사용하거나.


2.

소스파일 선두에... 다음과 같이 지정해서

//---------------------------------------------------------------------------
#pragma clang diagnostic ignored "-Wignored-attributes"

#ifndef Unit2H
#define Unit2H
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
......
class A
{
public:
  __fastcall A(){}
  __fastcall ~A(){}
};




컴파일러로 하여금 Warning을 무시하도록 할 수도 있죠.


그러나... 이 문제는 근본적으로 델파이 때문에 일어나는 문제이고...

서두에 언급한 대로...
ctor/dtor에 호출방식을 지정하지 않고, 컴파일러 디폴트 Internal 규격으로 컴파일 되도록 하는 게
C++ 스펙에 따라 사용하는 올바른 방법 입니다.

델파이 클래스 시멘틱 룰 종속성 때문에 C++ 컴파일러를 엉터리로 만들어 놓았던 거죠.



+ -

관련 글 리스트
75964 클래스 생성자 함수에 __fastcall 을 붙이면 에러가 발생하는 이유는?(빌더 10.4.1) 김시환 1249 2020/10/09
75987     Re:클래스 생성자 함수에 __fastcall 을 붙이면 에러가 발생하는 이유는?(빌더 10.4.1) 김상면 1037 2020/12/20
76034         Re: __fastcall 워닝. 이 또한 델파이 때문에 일어나는 문제 빌더(TWx) 1262 2021/02/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.