문제

여러 번 확인하고 싶습니다. 이 광고에 #define을 사용합니다. 사용하고 싶지만 작동하지 않습니다.

#define CHECK_CONDITION(QString condition, start, curr) if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())

그리고 나는 이것을 다음과 같이 사용합니다 :

if(CHECK_CONDITION(table.commonIn().toStdString(), start, start-idx);) {
   findFalse = true;
}

내 코드 에서이 정의를 어떻게 사용할 수 있습니까? 미리 감사드립니다.

도움이 되었습니까?

해결책

이 수정 된 매크로를 사용할 수 있습니다.

#define CHECK_CONDITION(condition, start, curr) \
    if(condition == "" || (condition == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())
.

이 매크로에서 만든 실수 :

  • 조건에 대한 QString 지정

  • 매크로의 반환 값의 논리가 없으므로 실제로 아웃터 함수에서 리턴 할 수 있습니다. 그것이 전처리 자 단계를 거쳐야하기 때문입니다.

  • 간단한 논리적이거나 ( "||") 매크로 내에 분리 된 분기가 필요하지 않습니다.

  • 조건 변수를 이미 전달 했더라도 매크로 내의 문자열 getter에서 공통 테이블을 사용했습니다.

  • i가 가독성을 향상시키기 위해서는 더 나은 가독성을 위해 조각으로 나눌 수 있습니다.

과 같은 코드를 다음과 같이 유지할 수 있습니다.

if(CHECK_CONDITION(table.commonIn(), start, (start-idx))) {
   findFalse = true;
}
.

여기에있는 실수 :

  • 유효하지 않은 C ++ 구문 인 경우 불필요한 세미콜론이 있습니다.

  • 뺄셈을 브래킷에 넣지 않고 일반적으로 문제가 발생할 수 있습니다.

  • 아래에서 설명한대로 check_condition 매크로 호출 전에 문자열 및 현재 정수에 대한 두 개의 개별 변수를 두 개로 만들 수 있습니다.

  • qstring 대신 std :: string을 전달하는 것입니다.

그러나 단순히 두 번째 부분 이이 것일 수 있다면 더욱 좋습니다 :

QString myString = table.commonIn();
int curr = start - idx;

if(CHECK_CONDITION(myString, start, curr)) {
   findFalse = true;
}
.

면책 조항 : 나는 당신의 매크로와 발신자를 일으키려고했지만, 가능한 한 매크로를 피하려고 노력하고 있습니다.

그들이 의미가있는 경우가 있지만 템플릿 (여기에 해당 사항이없는 경우) 또는 인라인 기능 및 방법 (해당되는 경우에 적용 가능한 경우 확실하지 않음)과 같은 대안이 있습니다. 유스 케이스에 따라 원하는대로 픽업 할 수 있지만이 답변을 사용하는 방법을 얻을 수 있습니다.

다른 팁

전처리기에는 유형에 대한 개념이 없으므로 #define 유형을 사용하면 매개변수 유형을 지정할 필요가 없습니다.

#define CHECK_CONDITION(condition, start, curr) { if(condition == "" ) return true; return (table.commonIn() == "team_id"? list()[start]->team() ==list()[curr]->team() :list()[start]->team() ==list()[curr]->team())}

게다가, #define 사용하는 곳에서 확장됩니다(전처리기 대체하다 CHECK_CONDITION 해당 코드 블록으로), 최소한 다음 한 가지 이유로 인해 코드가 컴파일되지 않습니다.당신은 중첩 될 것입니다 if 안에 if 조건은 구문 오류입니다.

대신 (아마도 인라인) 함수를 사용하세요:

inline
bool check_condition(QString condition, int start, int curr) {
    if(condition == "" ) return true;
    return (
        table.commonIn() == "team_id"?
            list()[start]->team() == list()[curr]->team():
            list()[start]->team() == list()[curr]->team()
    )
}

이는 또한 여기서 가능한 구문 오류를 명시적으로 만듭니다.마지막 두 줄은 무슨 뜻인지 모르겠어서 그대로 두었습니다...

내 2센트:최후의 수단으로 C++의 전처리기를 확인해야 합니다.템플릿, const 변수 및 인라인 함수가 있습니다.

C++에 남겨진 주된 이유는 ( include 키워드 단독 등)은 C와의 하위 호환성을 유지하는 것입니다.다른 솔루션이 상당히 복잡하지 않는 한 전처리기를 사용하지 마십시오.

#define C/C++에서는 간단한 텍스트 대체인 매크로 정의입니다.이 정의는 함수에 더 가깝고 매개변수 중 하나에 유형을 할당하려고 시도합니다.이는 올바른 구문이 아니므로 QString 부분을 ​​제거해야 합니다

전반적으로 이 코드는 매크로에 이상적으로 적합하지 않습니다.인수 start 그리고 curr 둘 다 확장에서 여러 번 사용됩니다.즉, 부작용을 일으키는 표현식이 매크로에 전달되면 잠재적으로 여러 번 실행될 수 있습니다.여기에는 기능이 훨씬 더 적절할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top