2010-07-31 15 views
6

इस जीसीसी चेतावनी का क्या अर्थ है?`-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__) 

कर सकता है और फिर आप भी , ## निर्माण की जीसीसी विस्तार से बचने चाहते हैं।

+1

इससे मुझे कुछ समय तक परेशान भी हुआ। असल में मानक तरीका 'log_debug ("% s", "बिटमैप रीसेट करना" होगा;'। – Dummy00001

+0

प्रीप्रोसेसर इलिप्सिस एक या अधिक तर्कों के लिए कितना अजीब बात करता है, फिर भी सी इलिप्सिस शून्य या अधिक के लिए प्रतिस्थापित करता है। मुझे सी 99 मानक से इस अर्थपूर्ण को निकालने में कुछ परेशानी हो रही है। –

1

इसका मतलब है कि आप log_debug करने के लिए एक दूसरा तर्क गुजर नहीं कर रहे हैं। यह ... भाग के लिए एक या अधिक तर्कों की अपेक्षा कर रहा है, लेकिन आप शून्य पास कर रहे हैं।

1

मुझे नीचे बताए गए अनुसार मेरे SNAP_LISTEN (...) मैक्रो के साथ एक समान समस्या है (हालांकि सी ++ में)। मुझे मिला एकमात्र समाधान एक नया मैक्रो SNAP_LISTEN0 (...) बनाना है जिसमें तर्क शामिल नहीं है ... पैरामीटर। मुझे अपने मामले में एक और समाधान नहीं दिख रहा है। -Wno-variadic-macros कमांड लाइन विकल्प विविध चेतावनी को रोकता है लेकिन आईएसओ सी 99 एक नहीं!

#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-variadic-मैक्रो ही काम करता है के बाद से मैं एक त्रुटि नहीं मिलता है कह रही है कि variadic स्वीकार नहीं किया गया है हालांकि, मुझे मैट जॉइनर के समान त्रुटि मिलती है:

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

जीसीसी का कौन सा संस्करण, और संकलन के दौरान आप क्या सी ++ संशोधन निर्दिष्ट कर रहे हैं? –

+0

मैंने अपने उत्तर में एक अपडेट किया क्योंकि मैं काफी कम -W कमांड लाइन विकल्पों का उपयोग करता हूं। –

संबंधित मुद्दे