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-unused
gcc/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
'programing' 카테고리의 다른 글
uint와 부호 없는 int의 차이점? (0) | 2022.08.18 |
---|---|
vuetify: 동적 목록을 사용하는 v-chip v-model (0) | 2022.08.18 |
(왜) 초기화되지 않은 변수를 사용하는 것은 정의되지 않은 동작입니까? (0) | 2022.08.18 |
C++ 또는 C에서 foo(void)와 foo() 사이에 차이가 있습니까? (0) | 2022.08.18 |
double-c-language에서 절대값을 얻는 방법 (0) | 2022.08.18 |