2010-07-31 48 views
6

Cảnh báo GCC này có nghĩa là gì?Cảnh báo trình biên dịch này được tạo ra bởi `-pedantic` có nghĩa là gì?

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

Các dòng có liên quan bao gồm:

__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"); 

Dòng cuối cùng hạnh phúc dòng 232 bên trong việc thực hiện chức năng. Cờ trình biên dịch là:

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

Trả lời

8

Có nghĩa là bạn phải chuyển ít nhất hai đối số theo cách bạn đã xác định. Bạn chỉ có thể làm

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

và sau đó bạn cũng nên tránh phần mở rộng gcc của cấu trúc , ##.

+1

Điều đó làm tôi bối rối trong một thời gian quá. Trên thực tế, cách tiêu chuẩn sẽ là 'log_debug ("% s "," Đặt lại bitmap ");'. – Dummy00001

+0

Làm thế nào kỳ quặc mà các dấu chấm lửng tiền xử lý thay thế cho một hoặc nhiều đối số, nhưng dấu ba chấm C thay thế cho số không hoặc nhiều hơn. Tôi đang gặp một số rắc rối khi trích xuất ngữ nghĩa này từ chuẩn C99. –

1

Điều đó có nghĩa là bạn không chuyển đối số thứ hai tới log_debug. Nó đang mong đợi một hoặc nhiều đối số cho phần ..., nhưng bạn đang chuyển số không.

1

Tôi gặp sự cố tương tự (mặc dù trong C++) với macro SNAP_LISTEN (...) của tôi như được định nghĩa bên dưới. Giải pháp duy nhất tôi tìm thấy là tạo một macro mới SNAP_LISTEN0 (...) không bao gồm tham số args .... Tôi không thấy một giải pháp nào khác trong trường hợp của tôi. Tùy chọn dòng lệnh -Wno-variadic-macros ngăn cảnh báo variadic chứ không phải cảnh báo 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)); 

Chỉnh sửa: trình biên dịch phiên bản

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. 

Edit: cảnh báo dòng lệnh

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") 

Các -Wno-variadic-macro tự làm việc kể từ khi tôi không nhận được một lỗi nói rằng variadic không được chấp nhận. Tuy nhiên, tôi nhận được lỗi tương tự như Matt Joiner:

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

Phiên bản nào của GCC và bản sửa đổi C++ nào bạn chỉ định trong quá trình biên dịch? –

+0

Tôi đã cập nhật câu trả lời của mình vì tôi sử dụng một vài tùy chọn dòng lệnh -W. –

Các vấn đề liên quan