回答編集履歴
7
衍字修正
test
CHANGED
@@ -58,8 +58,6 @@
|
|
58
58
|
|
59
59
|
warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
|
60
60
|
|
61
|
-
1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
|
62
|
-
|
63
61
|
```
|
64
62
|
|
65
63
|
|
6
コード分析結果例更新
test
CHANGED
@@ -40,7 +40,7 @@
|
|
40
40
|
|
41
41
|
out_func("out sentence1 = %s", 1);
|
42
42
|
|
43
|
-
out_func("out sentence1 = %s
|
43
|
+
out_func("out sentence1 = %s");
|
44
44
|
|
45
45
|
out_func("out sentence2 = %s", "one", "two");
|
46
46
|
|
@@ -54,7 +54,7 @@
|
|
54
54
|
|
55
55
|
warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
|
56
56
|
|
57
|
-
warning C6063: 'out_func' (変換指定子 '
|
57
|
+
warning C6063: 'out_func' (変換指定子 '1' に対応する) への文字列引数がありません。
|
58
58
|
|
59
59
|
warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
|
60
60
|
|
5
コード分析結果例追記
test
CHANGED
@@ -40,6 +40,10 @@
|
|
40
40
|
|
41
41
|
out_func("out sentence1 = %s", 1);
|
42
42
|
|
43
|
+
out_func("out sentence1 = %s %s", "one");
|
44
|
+
|
45
|
+
out_func("out sentence2 = %s", "one", "two");
|
46
|
+
|
43
47
|
```
|
44
48
|
|
45
49
|
に対するコード分析結果
|
@@ -49,6 +53,12 @@
|
|
49
53
|
warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
|
50
54
|
|
51
55
|
warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
|
56
|
+
|
57
|
+
warning C6063: 'out_func' (変換指定子 '2' に対応する) への文字列引数がありません。
|
58
|
+
|
59
|
+
warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
|
60
|
+
|
61
|
+
1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
|
52
62
|
|
53
63
|
```
|
54
64
|
|
4
コード分析例追記
test
CHANGED
@@ -38,6 +38,8 @@
|
|
38
38
|
|
39
39
|
out_func("out sentence1 = %d", "one");
|
40
40
|
|
41
|
+
out_func("out sentence1 = %s", 1);
|
42
|
+
|
41
43
|
```
|
42
44
|
|
43
45
|
に対するコード分析結果
|
@@ -45,6 +47,8 @@
|
|
45
47
|
```
|
46
48
|
|
47
49
|
warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
|
50
|
+
|
51
|
+
warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
|
48
52
|
|
49
53
|
```
|
50
54
|
|
3
コード分析結果追記
test
CHANGED
@@ -32,9 +32,29 @@
|
|
32
32
|
|
33
33
|
|
34
34
|
|
35
|
+
書式誤りの
|
36
|
+
|
37
|
+
```
|
38
|
+
|
39
|
+
out_func("out sentence1 = %d", "one");
|
40
|
+
|
41
|
+
```
|
42
|
+
|
43
|
+
に対するコード分析結果
|
44
|
+
|
45
|
+
```
|
46
|
+
|
47
|
+
warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
|
48
|
+
|
49
|
+
```
|
50
|
+
|
51
|
+
|
52
|
+
|
35
53
|
---
|
36
54
|
|
37
55
|
可変引数テンプレート版
|
56
|
+
|
57
|
+
可変引数テンプレートの場合は`_Printf_format_string_`をつけてもチェックしてくれないようです…
|
38
58
|
|
39
59
|
```C++
|
40
60
|
|
@@ -42,7 +62,7 @@
|
|
42
62
|
|
43
63
|
template <class...Args>
|
44
64
|
|
45
|
-
void out_func(
|
65
|
+
void out_func(const char* format, Args...args) {
|
46
66
|
|
47
67
|
int len = _scprintf(format, args...) + 1;
|
48
68
|
|
2
コード追記
test
CHANGED
@@ -29,3 +29,29 @@
|
|
29
29
|
}
|
30
30
|
|
31
31
|
```
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
---
|
36
|
+
|
37
|
+
可変引数テンプレート版
|
38
|
+
|
39
|
+
```C++
|
40
|
+
|
41
|
+
#include <vector>
|
42
|
+
|
43
|
+
template <class...Args>
|
44
|
+
|
45
|
+
void out_func(_Printf_format_string_ const char* format, Args...args) {
|
46
|
+
|
47
|
+
int len = _scprintf(format, args...) + 1;
|
48
|
+
|
49
|
+
std::vector<char> buffer(len * sizeof(char));
|
50
|
+
|
51
|
+
sprintf_s(&buffer[0], len, format, args...);
|
52
|
+
|
53
|
+
std::cout << &buffer[0] << std::endl;
|
54
|
+
|
55
|
+
}
|
56
|
+
|
57
|
+
```
|
1
コード修正
test
CHANGED
@@ -22,9 +22,9 @@
|
|
22
22
|
|
23
23
|
vsprintf_s(&buffer[0], len, format, args);
|
24
24
|
|
25
|
+
va_end(args);
|
26
|
+
|
25
27
|
std::cout << &buffer[0] << std::endl;
|
26
|
-
|
27
|
-
va_end(args);
|
28
28
|
|
29
29
|
}
|
30
30
|
|