문제

최근에 사무실에 참석 한 코딩 스타일 프레젠테이션은 변수가 정의 될 때 (기본값에) 할당되어서는 안된다고 주장했습니다. 대신, 사용 직전에 기본값을 할당해야합니다. 그래서, 같은 것

int a = 0;

눈살을 찌워야합니다.

분명히, 'int'의 예는 단순하지만 포인터 등과 같은 다른 유형에 대해서도 마찬가지입니다.

또한 C99 호환 컴파일러가 위에서 언급 한 경우에 경고를 던지는 것으로 언급되었습니다.

위의 접근법은 구조에만 유용한 것처럼 보입니다. 즉, 사용하기 전에만 memset. 구조가 오류 레그에서만 사용 (또는 채워진) 경우 효율적입니다.

다른 모든 경우에, 나는 코드를 작성하고 유지 관리하는 동안 이니셜 화 된 포인터로 인해 많은 버그가 발생했을 때 신중한 운동을 기본 가치로 정의하고 할당하는 것을 발견합니다. 또한 생성자를 통한 C ++는 또한 동일한 접근법을 정의하고 할당한다고 생각합니다.

C99 표준이 왜 정의 및 할당을 좋아하지 않는지 궁금합니다. 코딩 스타일 프레젠테이션이 옹호 한 일을하는 데 상당한 장점이 있습니까?

도움이 되었습니까?

해결책

일반적으로 그들이 가져야 할 값이 알려진 경우 정의 될 때 초기화 변수를 권장하고 값이 아닌 경우 변수를 초기화되지 않은 상태로 남겨 두십시오. 어느 쪽이든, 범위 규칙이 허용하는만큼 그들의 사용에 가깝게 넣으십시오.

대신, 사용 직전에 기본값을 할당해야합니다.

일반적으로 기본값을 전혀 사용해서는 안됩니다. C99에서는 코드와 선언을 혼합 할 수 있으므로 값을 할당하기 전에 변수를 정의하는 점이 없습니다. 취해야 할 값을 알고 있다면 기본값이있는 점이 없습니다.

또한 C99 호환 컴파일러가 위에서 언급 한 경우에 경고를 던지는 것으로 언급되었습니다.

당신이 보여주는 사건에 대해서는 - 당신은 int x = 0;. 나는 누군가가 이것을 혼합했다고 강력하게 의심한다. 컴파일러는 값을 할당하지 않고 변수를 사용하고 다음과 같은 경우 경고합니다.

... some code ...

int x;

if ( a )
    x = 1;
else if ( b )
    x = 2;
// oops, forgot the last case else x = 3;

return x * y;

그런 다음 적어도 GCC와 함께 초기화되지 않고 X를 사용할 수 있다는 경고를받습니다.

값을 할당하면 경고를받지 못합니다. x 전에 if, 그러나 할당이 이니셜 라이저 또는 별도의 진술로 수행되는지 여부는 관련이 없습니다.

두 분기에 대해 값을 두 번 할당 해야하는 특정한 이유가 없다면, 기본값을 x에 x에 할당하는 점이 없습니다. 컴파일러가 모든 지점을 덮었다는 경고를 중지하므로.

다른 팁

거기 있습니다 아니요 C99에서 그러한 요구 사항 (또는 내가 알고있는 지침)도 컴파일러가 경고하지도 않습니다. 그것은 단순히 스타일의 문제입니다.

코딩 스타일에 관한 한, 나는 당신이 문자 그대로 일을 너무 가져 갔다고 생각합니다. 예를 들어, 다음 경우에 귀하의 진술이 옳습니다 ...

int i = 0;

for (; i < n; i++)
        do_something(i);

... 또는 심지어 ...

int i = 1;

[some code follows here]

while (i < a)
        do_something(i);

... 그러나 내 마음에는 초기 "선언 및 할당"으로 더 잘 처리되는 다른 경우가 있습니다. 스택 또는 다양한 OOP 구조물에 구성된 구조를 다음과 같이 고려하십시오.

struct foo {
        int bar;

        void *private;
};

int my_callback(struct foo *foo)
{
        struct my_struct *my_struct = foo->private;

        [do something with my_struct]

        return 0;
}

또는 (C99 Struct Initializers)와 마찬가지로 :

void do_something(int a, int b, int c)
{
        struct foo foo = {
                .a        = a,
                .b        = b + 1,
                .c        = c / 2,
        };

        write_foo(&foo);
}

나는 표준이 그것에 대해 아무 말도하는 것을 확실히 확신하지는 않지만 조언에 동의하며, 컴파일러 경고에 대한 비트는 사실입니다.

문제는 최신 컴파일러가 무시되지 않은 변수의 사용을 감지 할 수 있고 감지 할 수 있다는 것입니다. 초기화시 변수를 기본값으로 설정하면 해당 감지가 손실됩니다. 기본값도 버그를 유발할 수 있습니다. 확실히 당신의 예의 경우, int a = 0;. 누가 말한다 0 적절한 가치입니다 a?

1990 년대에는 조언이 잘못되었을 것입니다. 요즘에는 맞습니다.

일부 기본 데이터를 변수에 사전 할당하여 코드에서 널 검사 할 필요가 없도록 매우 유용합니다.

초기화되지 않은 포인터로 인해 많은 버그를 보았으므로 항상 각 변수를 NULL_PTR로 선언하고 각각의 원시는 유효하지 않은/기본값을 사용합니다.

RTO 및 고성능이지만 낮은 리소스 시스템에서 작업하기 때문에 사용하는 컴파일러가 비 이니셜 사용을 포착하지 못할 수 있습니다. 현대 컴파일러도 100%에 의존 할 수 있다고 의심합니다.

매크로가 광범위하게 사용되는 대규모 프로젝트에서는 kloclwork /purify조차도 비 이용되지 않은 사용을 찾지 못한 드문 시나리오를 보았습니다.

그래서 나는 당신이 평범한 오래된 c/c ++를 사용하는 한 그것을 고수한다고 말합니다.

.NET과 같은 최신 언어는 계를 초기화하거나 초기화되지 않은 가변 사용에 대한 컴파일러 오류를 제공 할 수 있습니다. 다음 링크는 성능 분석을 수행하고 .NET에 대해 10-20%의 성능이 적용되는지 확인합니다. 분석은 매우 자세하고 잘 설명됩니다.

http://www.codeproject.com/kb/dotnet/dontinitializevariables.aspx

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