2010-07-31 3 views
6

이 GCC 경고는 무엇을 의미합니까?`-pedantic`에 의해 생성 된이 컴파일러 경고는 무엇을 의미합니까?

cpfs.c:232:33: warning: ISO C99 requires rest arguments to be used 

관련 라인은 : 기능 구현 내부

__attribute__((format(printf, 2, 3))) 
static void cpfs_log(log_t level, char const *fmt, ...); 

#define log_debug(fmt, ...) cpfs_log(DEBUG, fmt, ##__VA_ARGS__) 

log_debug("Resetting bitmap"); 

마지막 줄 존재 라인 (232). 컴파일러 플래그는 다음과 같습니다.

-g -Wall -std=gnu99 -Wfloat-equal -Wuninitialized -Winit-self -pedantic 

답변

8

예, 정의한 방식으로 최소한 두 개의 인수를 전달해야합니다. 당신은

#define log_debug(...) cpfs_log(DEBUG, __VA_ARGS__) 

을 할 수있는 다음도 , ## 구조의 GCC 확장을 피할 것.

+1

나는 꽤 오랫동안 나를 혼란스럽게 만들었습니다. 실제로 표준적인 방법은'log_debug ("% s", "Resetting bitmap");'입니다. – Dummy00001

+0

선행 처리기 생략 부호가 하나 이상의 인수를 대체하는 것이 얼마나 이상한 지 알지만 C 생략 부호는 0 이상을 대체합니다. 이 의미를 C99 표준에서 추출하는 데 문제가 있습니다. –

1

즉, log_debug에 두 번째 인수를 전달하지 않습니다. ... 부분에 대해 하나 이상의 인수가 필요하지만 0을 전달합니다.

1

아래 정의 된대로 내 SNAP_LISTEN (...) 매크로를 사용하여 비슷한 문제가 발생합니다 (C++에서도). 내가 찾은 유일한 해결책은 args ... 매개 변수를 포함하지 않는 새로운 매크로 SNAP_LISTEN0 (...)을 만드는 것입니다. 내 경우에는 다른 해결책이 보이지 않는다. -Wno-variadic-macros 명령 행 옵션은 가변적 인 경고를 방지하지만 ISO C99는 경고하지 않습니다!

#define SNAP_LISTEN(name, emitter_name, emitter_class, signal, args...) \ 
    if(::snap::plugins::exists(emitter_name)) \ 
     emitter_class::instance()->signal_listen_##signal(\ 
      boost::bind(&name::on_##signal, this, ##args)); 

#define SNAP_LISTEN0(name, emitter_name, emitter_class, signal) \ 
    if(::snap::plugins::exists(emitter_name)) \ 
     emitter_class::instance()->signal_listen_##signal(\ 
      boost::bind(&name::on_##signal, this)); 

편집 : 컴파일러 버전

g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 
Copyright (C) 2011 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

편집 : 말하는 명령 행 경고

set(CMAKE_CXX_FLAGS "-Werror -Wall -Wextra -pedantic -std=c++0x 
    -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization 
    -Wformat=2 -Winit-self -Wlogical-op -Wmissing-include-dirs -Wnoexcept 
    -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow 
    -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default 
    -Wundef -Wno-unused -Wno-variadic-macros -Wno-parentheses 
    -fdiagnostics-show-option") 

나는 오류가 발생하지 않기 때문에 그 자체가 작동하는 -Wno - 가변 - 매크로 그 가변 받아 들여지지 않는다. 그러나 매트 죠이너와 같은 오류가 발생합니다.

cpfs.c:232:33: warning: ISO C99 requires rest arguments to be used 
+0

GCC의 어떤 버전이고 컴파일하는 동안 어떤 C++ 개정판을 지정합니까? –

+0

꽤 많은 -W 명령 행 옵션을 사용하기 때문에 필자는 내 대답을 업데이트했습니다. –