cpp에서 #define으로 함수를 정의하시겠습니까?
문제
여러 번 확인하고 싶습니다. 이 광고에 #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
둘 다 확장에서 여러 번 사용됩니다.즉, 부작용을 일으키는 표현식이 매크로에 전달되면 잠재적으로 여러 번 실행될 수 있습니다.여기에는 기능이 훨씬 더 적절할 것입니다.