programing

C에서 "미사용 파라미터" 경고를 억제하려면 어떻게 해야 합니까?

minecode 2022. 8. 18. 22:34
반응형

C에서 "미사용 파라미터" 경고를 억제하려면 어떻게 해야 합니까?

예:

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

에는 C++, C++, C++를 수 ./*...*/이치노하지만 C에서는 물론 오류가 발생합니다.

오류: 매개 변수 이름이 누락되었습니다.

저는 보통 다음과 같은 매크로를 씁니다.

#define UNUSED(x) (void)(x)

이 매크로는 사용하지 않는 모든 파라미터에 사용할 수 있습니다.(이 매크로는 컴파일러에서 동작합니다.

예를 들어 다음과 같습니다.

void f(int x) {
    UNUSED(x);
    ...
}

GCC에서는 Atribute로 파라미터에 라벨을 붙일 수 있습니다.

변수에 연결된 이 속성은 변수가 사용되지 않을 수 있음을 의미합니다.GCC는 이 변수에 대한 경고를 생성하지 않습니다.

실제로 이것은 다음과 같은 방법으로 이루어집니다.__attribute__ ((unused))이치예를 들어 다음과 같습니다.

void foo(workerid_t workerId) { }

된다

void foo(__attribute__((unused)) workerid_t workerId) { }

GCC 또는 Clang미사용 속성을 사용할 수 있습니다.단, 이러한 매크로를 헤더로 사용하여 소스 전체에 GCC 고유의 Atribut이 있는 것을 방지하고,__attribute__어느 곳이든 약간 장황하다.

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif

#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

그럼 당신은...

void foo(int UNUSED(bar)) { ... }

에 저는 을 선호합니다.bar코드를 입력하지 않기 때문에, 어트리뷰트를 잘못 입력할 수 없습니다.

그리고 기능은...

static void UNUSED_FUNCTION(foo)(int bar) { ... }

주1):

가 알기로는 MSVC는 다음 제품과 동등하지 않습니다.__attribute__((__unused__)).

주 2):

UNUSED 즉 괄호를 하지 않습니다.
float (*coords)[3]할 수 없어
float UNUSED((*coords)[3]) ★★★★★★★★★★★★★★★★★」float (*UNUSED(coords))[3]은 「이것」의 UNUSED, 에는 다시 '마크로', '마크로', '마크로', '마크로', '마크로'로.(void)coords;.

로 마킹되어 "gcc" 를 할 수 .Wno-unused-parameter.

예를 들어 다음과 같습니다.

gcc -Wno-unused-parameter test.c

물론 이것은 파일 전체에 영향을 미치지만(스위치의 설정 장소에 따라서는 프로젝트도 생각할 수 있습니다), 코드를 변경할 필요는 없습니다.

C++17'은[[maybe_unused]]Atribute를 사용하면 미사용 파라미터에 대한 경고를 억제할 수 있습니다.

OP의 샘플 코드를 기반으로 합니다.

Bool NullFunc([[maybe_unused]] const struct timespec *when, [[maybe_unused]] const char *who)
{
   return TRUE;
}

소스 코드 블록의 미사용 파라미터 경고를 억제하는 gcc/g++ 고유의 방법은 다음 플러그마문으로 둘러싸는 것입니다.

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop

미사용 Atribute를 가지는 GCC의 경우:

int foo (__attribute__((unused)) int bar) {
    return 0;
}

저도 같은 문제가 생겼어요.나는 3부 도서관을 이용했다.이 라이브러리를 컴파일하면 컴파일러(gcc/clang)가 미사용 변수에 대해 불만을 제기합니다.

이것처럼.

test.cpp:29:11: warning: 변수 'set'이 설정되었지만 사용되지 않음 [-Wunused-but-set-variable] 짧은 매직[] = {

test.cpp:84:17: warning: 미사용 변수 'before_write' [-Wunused-variable] int64_t before_write = 스레드::currentTimeMillis();

그래서 해결책은 매우 명확합니다.추가 중-Wno-unusedgcc/clang CFLAG는 모든 "미사용" 경고를 억제하므로-Wall세트.

이렇게 하면 코드를 변경할 필요가 없습니다.

참고로 Job의 답변은 마음에 들지만 변수 이름만 "do-nothing" 스테이트먼트에서 사용하는 솔루션이 궁금합니다.

void foo(int x) {
    x; /* unused */
    ...
}

물론 여기에는 단점도 있습니다. 예를 들어, "사용하지 않은" 노트가 없으면 의도적인 코드 행이라기보다는 실수처럼 보입니다.

장점은 정의가 필요하지 않고 경고가 제거된다는 것입니다.

속성에 라벨을 붙이는 것이 이상적입니다.매크로로 인해 혼란이 발생할 수 있습니다.void(x)를 사용하여 가공에 오버헤드를 추가합니다.

input 인수를 사용하지 않을 경우 를 사용합니다.

void foo(int __attribute__((unused))key)
{
}

함수 내부에 정의된 변수를 사용하지 않는 경우

void foo(int key)
{
   int hash = 0;
   int bkt __attribute__((unused)) = 0;

   api_call(x, hash, bkt);
}

나중에 해시 변수를 논리용으로 사용하지만 bkt는 필요하지 않습니다. bkt를 사용하지 않는 것으로 정의하십시오. 그렇지 않으면 컴파일러는 'bkt set bt not used'라고 말합니다.

메모: 이것은 최적화가 아닌 경고를 억제하기 위한 것입니다.

MSVC에서는 특정 경고를 억제하기 위해 컴파일러의 번호를 /wd#로 지정하면 됩니다.마이 CMake Liststxt에는 다음과 같은 블록이 포함되어 있습니다.

If (MSVC)
    Set (CMAKE_EXE_LINKER_FLAGS "$ {CMAKE_EXE_LINKER_FLAGS} / NODEFAULTLIB: LIBCMT")
    Add_definitions (/W4 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127)
    Add_definitions (/D_CRT_SECURE_NO_WARNINGS)
Elseif (CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_GNUC)
    Add_definitions (-Wall -W -pedantic)
Else ()
    Message ("Unknown compiler")
Endif ()

3년간 MSVC에 주의를 기울이지 않기 때문에 /wd4512 /wd4702 /wd4100 /wd4510 /wd4355 /wd4127이 정확히 무엇을 의미하는지 알 수 없지만 결과에 영향을 주지 않는 슈퍼패셔널한 경고는 억제됩니다.

이 스타일을 사용한 적이 있습니다.

if (when || who || format || data || len);

언급URL : https://stackoverflow.com/questions/3599160/how-can-i-suppress-unused-parameter-warnings-in-c

반응형