2011-11-03 14 views
4

C++ 11標準指定vwscanf可通過標頭<cwchar>(因此可用<wchar.h>)獲得。但是它似乎缺乏Visual C++。有了這個功能,我可以寫出&hellip;解決Visual C++中缺少vwscanf的更好方法?

inline int scanf(CodingValue const* format, ...) 
{ 
    va_list args; 
    va_start(args, format); 
    return ::vwscanf(format->ptr(), args); 
} 

但是如果沒有它,即用Visual C++ 10.0,這似乎也缺乏C++ 11可變參數模板的支持,我’米減少到寫作&hellip;

inline int scanf(
    CodingValue const* format, 
    void* a01 = 0, void* a02 = 0, void* a03 = 0, void* a04 = 0, void* a05 = 0, 
    void* a06 = 0, void* a07 = 0, void* a08 = 0, void* a09 = 0, void* a10 = 0, 
    void* a11 = 0, void* a12 = 0 
    ) 
{ 
    int const nArgs = !!a01 + !!a02 + !!a03 + !!a04 + !!a05 + !!a06 + 
         !!a07 + !!a08 + !!a09 + !!a10 + !!a11 + !!a12; 
    BasicCodingValue const* const f = format->ptr(); 

    switch(nArgs) 
    { 
    case 0: return ::wscanf(f); 
    case 1: return ::wscanf(f,a01); 
    case 2: return ::wscanf(f,a01,a02); 
    case 3: return ::wscanf(f,a01,a02,a03); 
    case 4: return ::wscanf(f,a01,a02,a03,a04); 
    case 5: return ::wscanf(f,a01,a02,a03,a04,a05); 
    case 6: return ::wscanf(f,a01,a02,a03,a04,a05,a06); 
    case 7: return ::wscanf(f,a01,a02,a03,a04,a05,a06,a07); 
    case 8: return ::wscanf(f,a01,a02,a03,a04,a05,a06,a07,a08); 
    case 9: return ::wscanf(f,a01,a02,a03,a04,a05,a06,a07,a08,a09); 
    case 10: return ::wscanf(f,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10); 
    case 11: return ::wscanf(f,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11); 
    case 12: return ::wscanf(f,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12); 
    } 
} 

或者,我可以做一些彙編,因爲我不喜歡15年前,當我遇到類似的(或者相同)的問題,但是,這並不手感相當不錯。

你能提出一些更好的方法嗎?

+0

*您可以*,但到底爲什麼會要? – Puppy

+0

檢出http://social.msdn。microsoft.com/Forums/en-AU/vclanguage/thread/b043efbc-b4d8-413b-bd21-937bd0d5dd8e –

+0

@EmileCormier - 這些不是引用或任何你不能在C中做的,所以我不認爲這是一個問題在這裏。 – Flexo

回答

2

據我所知,在C語言中調用帶有額外(即多於要求)參數的可變參數並不是一個錯誤(也可能在C++中,儘管我還沒有在這方面找到一個明確的語句)。

我已經在C++方面得到了最好的到目前爲止是5.2.2 [expr.call]:

的函數可以聲明爲接受更少的參數(通過聲明 默認參數(8.3。 6))或多個參數(通過使用省略號, ...,或函數參數包(8.3.5))比的 參數在函數定義(8.4)

18.10 [支持數.runtime]根據關於的限制的ISO C 4.8.1.1 10。

我看不到任何說「你不能傳遞額外參數」的地方,所以似乎認爲它不被禁止是不合理的。

如果在C++中給出額外的參數不合法,那麼您可以使用C++來處理默認參數,並調用一個C函數,默認值已被「填充」,這樣您只能調用一個C函數,不管有多少參數。

所以在C++中,你會怎麼做:

extern "C" { 
    int real_scanf(
     const char* format, 
     void* a01, void* a02, void* a03, void* a04, void* a05, 
     void* a06, void* a07, void* a08, void* a09, void* a10, 
     void* a11, void* a12 
     ); 
} 

inline int scanf(
    CodingValue const* format, 
    void* a01 = 0, void* a02 = 0, void* a03 = 0, void* a04 = 0, void* a05 = 0, 
    void* a06 = 0, void* a07 = 0, void* a08 = 0, void* a09 = 0, void* a10 = 0, 
    void* a11 = 0, void* a12 = 0 
    ) 
{ 
    BasicCodingValue const* const f = format->ptr(); 
    return real_scanf(f,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12); 
} 

,然後用C,你可以這樣做:

int real_scanf(
    const char* format, 
    void* a01, void* a02, void* a03, void* a04, void* a05, 
    void* a06, void* a07, void* a08, void* a09, void* a10, 
    void* a11, void* a12 
    ) 
{ 
    return wscanf(format,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12); 
} 
+0

+1不錯,但a01至a12需要默認值,如Alf的問題 – mloskot

+0

@mloskot - 該部分的想法是,他們顯式*不是默認值,因此它可能是嚴格的C函數,如果需要解決C和C++規則之間在這些函數上的任何區別,可以通過C++默認值函數調用該函數。 – Flexo

+1

正式支持:我的C99草案在§7.24.2.11中說'wscanf'等同於'fwscanf'參數'stdin';那麼關於'fwscanf'的§7.24.2.2說:「如果格式在參數保留時耗盡,那麼多餘的參數將被評估(一如既往),否則將被忽略。」歡呼聲,謝謝, –

1

我的版本awoodland的答案:默認值參數是必需的:

#include <cstdio> 
#include <cassert> 

template <typename CodingValue> 
int scanf(CodingValue const* format, 
    void* a01 = 0, void* a02 = 0, void* a03 = 0, void* a04 = 0, void* a05 = 0, 
    void* a06 = 0, void* a07 = 0, void* a08 = 0, void* a09 = 0, void* a10 = 0, 
    void* a11 = 0, void* a12 = 0) 
{ 
    return wscanf(format,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12); 
} 

int main() 
{ 
    int v(0); 
    int rc = scanf<wchar_t>(L"%d", &v); 
    assert(1 == rc); 
    return 0; 
} 

請參閱Dennis Zickefoose以上有關背景細節的評論。

0

VS2010有一個實現int vwscanf(format, ...)

文件= wscanf.c

目錄= C:\ Program Files文件(x86)的\微軟的Visual Studio 10.0 \ VC \ CRT \ SRC

相關問題