웹사이트 검색

흔하지 않지만 유용한 GCC 명령줄 옵션 - 2부


이 페이지에서

  1. -Wall이 적용되지 않는 경고 사용
  2. 주식 비교에서 부동 소수점 값에 대한 경고 사용\n
  3. gcc 명령줄 옵션을 더 잘 관리하는 방법\n
  4. 결론

gcc 컴파일러는 끝없는 명령줄 옵션 목록을 제공합니다. 물론 모든 것을 사용하거나 전문 지식을 가진 조직은 없지만 모든 gcc 사용자가 반드시 알아야 하는 것은 아닙니다. 그들 중 일부는 일반적으로 사용되는 반면 다른 것들은 약간 드물지만 덜 유용하지는 않습니다.

이 기사 시리즈에서는 흔하지 않지만 유용한 gcc 명령줄 옵션 중 일부에 초점을 맞추고 있으며 이미 1부에서 몇 가지를 다뤘습니다.

이 튜토리얼 시리즈의 첫 번째 부분에서 개발자가 일반적으로 경고를 생성하는 데 사용하는 -Wall 옵션이 일부 특정 경고를 다루지 않는다고 간단히 언급한 것을 기억하시나요? 이러한 경고를 알지 못하고 사용 설정 방법을 모른다고 해도 걱정하지 마세요. 이 도움말에서 모든 내용을 자세히 설명하세요.

이 외에도 부동 소수점 변수와 관련된 gcc 경고 옵션과 목록이 커지는 경우 gcc 명령줄 옵션을 더 잘 관리하는 방법도 다룰 것입니다.

하지만 계속 진행하기 전에 이 튜토리얼에 언급된 모든 예제, 명령 및 지침은 Ubuntu 16.04 LTS에서 테스트되었으며 우리가 사용한 gcc 버전은 5.4.0임을 명심하십시오.

<엠>

-Wall이 적용되지 않는 경고 활성화

gcc 컴파일러의 -Wall 옵션이 대부분의 경고 플래그를 처리하지만 일부는 비활성화된 상태로 남아 있습니다. 활성화하려면 -Wextra 옵션을 사용하십시오.

예를 들어 다음 코드를 살펴보십시오.

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=0;
/* ...
some code here
...
*/

if(i);
return 1;
return 0;
}

if 조건 뒤에 실수로 세미콜론을 넣었습니다. 이제 다음 gcc 명령을 사용하여 코드를 컴파일할 때 경고가 생성되지 않았습니다.

gcc -Wall test.c -o test

그러나 -Wextra 옵션이 사용된 경우:

gcc -Wall -Wextra test.c -o test

다음과 같은 경고가 생성되었습니다.

test.c: In function ‘main’:
test.c:10:8: warning: suggest braces around empty body in an ‘if’ statement [-Wempty-body]
if(i);

위에 표시된 경고에서 알 수 있듯이 -Wextra 옵션은 내부적으로 -Wempty-body 플래그를 활성화했으며, 이는 다시 의심스러운 코드를 감지하고 경고를 발행했습니다. 다음은 이 옵션으로 활성화된 전체 경고 플래그 목록입니다.

-Wclobbered, -Wempty-body, -Wignored-qualifiers, -Wmissing-field-initializers, -Wmissing-parameter-type(C 전용), -Wold-style-declaration(C 전용), -Woverride-init, -Wsign- compare, -Wtype-limits, -Wuninitialized, -Wunused-parameter(-Wunused 또는 -Wall에만 해당) 및 -Wunused-but-set-parameter(-Wunused 또는 -Wall에만 해당).

위에서 언급한 플래그가 무엇을 하는지 알고 싶다면 gccs 매뉴얼 페이지로 이동하십시오.

계속해서 -Wextra 옵션은 다음과 같은 경우에도 경고를 표시합니다.

  • 포인터는 <, <=, > 또는 >=로 정수 0과 비교됩니다.
  • (C++에만 해당) 열거자와 비열거자 모두 조건식에
    나타납니다.\n
  • (C++ 전용) 모호한 가상 베이스.\n
  • (C++에만 해당) 레지스터로 선언된 배열을 첨자화합니다.\n
  • (C++에만 해당) 레지스터로 선언된 변수의 주소를 가져옵니다.\n
  • (C++에만 해당) 파생 클래스 복사 생성자에서 기본 클래스가 초기화되지 않습니다.\n

주식 비교에서 부동 소수점 값에 대한 경고 사용

이미 알고 계시겠지만 부동 소수점 값이 정확히 같은지 테스트해서는 안 됩니다(모르겠습니다. 여기에서 부동 소수점 비교 관련 FAQ를 읽어보세요). 그러나 실수로 이렇게 해도 gcc 컴파일러에서 경고나 오류가 발생합니까? 확인하자:

다음은 == 연산자를 사용하여 부동 소수점 변수를 비교하는 코드입니다.

#include<stdio.h>

void compare(float x, float y)
{
if(x == y)
{
printf("\n EQUAL \n");
}
}


int main(void)
{
compare(1.234, 1.56789);

return 0;
}

다음은 이 코드를 컴파일하는 데 사용되는 gcc 명령(-Wall 및 -Wextra 옵션 모두 포함)입니다.

gcc -Wall -Wextra test.c -o test

슬프게도 위의 명령은 부동 소수점 비교와 관련된 경고를 생성하지 않습니다. GCC 매뉴얼 페이지를 간단히 살펴보면 이러한 시나리오에서 사용해야 하는 전용 옵션 -Wfloat-equal이 있음을 알 수 있습니다.

이 옵션이 포함된 명령은 다음과 같습니다.

gcc -Wall -Wextra -Wfloat-equal test.c -o test

다음은 생성된 출력입니다.

test.c: In function ‘compare’:
test.c:5:10: warning: comparing floating point with == or != is unsafe [-Wfloat-equal]
if(x == y)

위의 출력에서 볼 수 있듯이 -Wfloat-equal 옵션은 gcc가 부동 비교와 관련된 경고를 생성하도록 강제했습니다.

다음은 이 옵션에 대한 gcc 매뉴얼 페이지의 내용입니다.

The idea behind this is that sometimes it is convenient (for the programmer) to consider floating-point values as approximations to infinitely precise real numbers. If you are doing this, then you
need to compute (by analyzing the code, or in some other way) the maximum or likely maximum error that the computation introduces, and allow for it when performing comparisons (and when producing
output, but that's a different problem). In particular, instead of testing for equality, you shouldcheck to see whether the two values have ranges that overlap; and this is done with the relational operators, so equality comparisons are probably mistaken.

gcc 명령줄 옵션을 더 잘 관리하는 방법

gcc 명령에서 사용 중인 명령줄 옵션 목록이 커지고 관리하기 어려운 경우 텍스트 파일에 넣고 해당 파일 이름을 gcc 명령의 인수로 전달할 수 있습니다. 이를 위해 @file 명령줄 옵션을 사용해야 합니다.

예를 들어 다음이 gcc 명령인 경우:

gcc -Wall -Wextra -Wfloat-equal test.c -o test

그런 다음 세 가지 경고 관련 옵션을 gcc-options라는 이름의 파일에 넣을 수 있습니다.

$ cat gcc-options 
-Wall -Wextra -Wfloat-equal

그리고 gcc 명령이 덜 복잡해지고 관리하기 쉬워집니다.

gcc @gcc-options test.c -o test

@file에 대한 gcc 매뉴얼 페이지의 내용은 다음과 같습니다.

Read command-line options from file. The options read are inserted in place of the original @file option. If file does not exist, or cannot be read, then the option will be treated literally, and not removed.

Options in file are separated by whitespace. A whitespace character may be included in an option by surrounding the entire option in either single or double quotes. Any character (including a backslash) may be included by prefixing the character to be included with a backslash. The file may itself contain additional @file options; any such options will be processed recursively.

결론

따라서 이 튜토리얼 시리즈에서는 일반적이지 않지만 유용한 총 5개의 gcc 명령줄 옵션인 -save-temps, -g, -Wextra, -Wfloat-equal 및 @file을 다루었습니다. 그들 각각을 연습하는 데 시간을 할애하고 그들에 대해 gcc 매뉴얼 페이지에서 제공하는 모든 세부 사항을 검토하는 것을 잊지 마십시오.

다른 유용한 gcc 명령줄 옵션을 알고 있거나 사용하고 있으며 이를 전 세계와 공유하고 싶습니까? 아래 댓글에 모든 세부 정보를 남겨주세요.