2017-10-03 25 views
0

저는 오래된 c를 C++로 천천히 업데이트하는 환경에서 작업합니다. 평등 진술에서 종종 비 클래스 enum이 사용됩니다.비 클래스 enums (왼쪽의 rvalues)에 대한 동등성이있는 우수 사례

이제 프로그래밍 실습을 받거나 우수 사례를 다루는 책을 읽은 사람이라면 lvalues와 rvalues ​​사이의 동등성은 왼쪽의 rvalue로 구조화되어 '== '은'= '로 대체됩니다. 나는 열거로이 일을 한 번도 본 적이 없다. 쉬운 대답은 enum 클래스를 사용하는 것이지만 오래된 코드의 큰 시체로 항상 즉시 수행 될 수는 없습니다. 열거 형은 기본적으로 정수형이므로 왼쪽 열에도 열거 형을 유지하는 것이 좋습니다.

나는 그것이 좋은 연습 간주 될뿐만 아니라 열거의 왼쪽에 우변을 유지하려면 더 나은

#include <iostream> 
using namespace std; 
    int number; 
    enum Color { RED, GREEN, BLUE }; 
int main() { 
    number = 1234; 
    Color color = BLUE; 

    // This is done 
    if (555 == number) { /*...*/ } 

    // So that this never accidently happens 
    if (number = 555) { /*...*/ } 

    // Resulting in this (number changed to 555) 
    cout << number <<endl; 

    // I have never seen this done 
    if (RED == color ) { /*...*/ } 

    // should it be to, prevent this 
    if (color = RED) { /*...*/ } 

    //Resulting in this (color changed to 0 or RED) 
    cout << color <<endl; 

    return 0; 
} 
+0

"요다 스타일"비교에 대해 이야기하고 있습니다. 현대의 컴파일러가 의심스러운 과제에 대한 경고를하기 때문에 요즘은 더 이상 사용되지 않는 것으로 간주됩니다. 일부는 동의하지 않습니다. –

+2

* 프로그래밍 과정을 밟거나 우수 사례를 다루는 책을 읽은 사람이라면 우연한 '='을 방지하기 위해 평등을 왼쪽에있는 값으로 구성해야한다는 것을 알고있을 것입니다. * 사실이 아닙니다. 그리고 괜찮은 컴파일러는 어쨌든 이러한 경우에 대한 경고를 트리거합니다. – sidyll

+1

^* Quod Erat Demonstrandum * :) –

답변

2

아래에 설명하기 위해 작은 예를 썼다?

실제로 리터럴을 사용하더라도 정확하게 "우수 사례"는 아닙니다. 이 개념은 과거에는 나타 났지만 대부분의 사람들이 오른쪽에서 리터럴을 읽는 것이 훨씬 더 읽기 쉽습니다 (또한 가장 많이 변경되는 변수, 특히 먼저 오는 변수).

가독성을 위해 오타 방지 기능을 사용하는 것이 항상 바람직한 것은 아닙니다. 읽을 수있는 코드는 실제로 변경되지 않았으며 결코 존재하지 않을 오래된 개념입니다. 그래서 결국보다 의미가 있고 유지하기가 더 쉽습니다. 이러한 종류의 오류를 방지하는 것은 컴파일러에게 맡겨야하며, 괜찮은 컴파일러는 그러한 경우 경고를 트리거합니다.

+0

가독성이 중요하다는 것에 전적으로 동의하고 있지만 문제는 제 상황에서는 8000 개의 소스 파일을 변경할 수 있다는 것입니다.이 파일은 30 개의 다른 파일, 많은 사람들이 관리하는 저장소 및 이전 버전과 연결해야합니다 나는보다. 컴파일은 30 코어를 사용하여 1 시간 30 분이 소요됩니다. 수백 가지 경고가 나타나는 것은 정상입니다.물론 좋은 것은 아니지만 하루가 끝나면 다른 사람이 아니라 내 코드에 대해 걱정할 필요가 있습니다. – mreff555

+0

@DanFeerst 귀하의 의견을 이해할 수 있을지 확실하지 않습니다. 수백 가지 경고를 보는 것이 정상적인 고려 사항과 별도로 문제가 정확히 무엇입니까? 프로젝트 협약을 준수해야합니까? 그렇다면 어쨌든이 질문을 게시하는 이유는 무엇입니까? – sidyll

+0

그것의 선호하지만, 시행하지, 그리고 내가 말했듯이, 아무도 enums로 이것을하지 않습니다. 나는 가장 통어적인 접근 방식이 무엇인지 궁금해서 질문을하고있었습니다. 호기심은 큰 코드베이스에서 문제를 일으킬 수있는 것으로 인식하여 발생했습니다. 귀하의 게시물이 내 질문에 답변을한다고 가정합니다 (+1). 문제가 해결되지 않습니다. – mreff555