teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

衍字修正

2020/08/05 08:40

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -28,7 +28,6 @@
28
28
  warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
29
29
  warning C6063: 'out_func' (変換指定子 '1' に対応する) への文字列引数がありません。
30
30
  warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
31
- 1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
32
31
  ```
33
32
 
34
33
  ---

6

コード分析結果例更新

2020/08/05 08:40

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -19,14 +19,14 @@
19
19
  ```
20
20
  out_func("out sentence1 = %d", "one");
21
21
  out_func("out sentence1 = %s", 1);
22
- out_func("out sentence1 = %s %s", "one");
22
+ out_func("out sentence1 = %s");
23
23
  out_func("out sentence2 = %s", "one", "two");
24
24
  ```
25
25
  に対するコード分析結果
26
26
  ```
27
27
  warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
28
28
  warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
29
- warning C6063: 'out_func' (変換指定子 '2' に対応する) への文字列引数がありません。
29
+ warning C6063: 'out_func' (変換指定子 '1' に対応する) への文字列引数がありません。
30
30
  warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
31
31
  1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
32
32
  ```

5

コード分析結果例追記

2020/08/05 08:39

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -19,11 +19,16 @@
19
19
  ```
20
20
  out_func("out sentence1 = %d", "one");
21
21
  out_func("out sentence1 = %s", 1);
22
+ out_func("out sentence1 = %s %s", "one");
23
+ out_func("out sentence2 = %s", "one", "two");
22
24
  ```
23
25
  に対するコード分析結果
24
26
  ```
25
27
  warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
26
28
  warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
29
+ warning C6063: 'out_func' (変換指定子 '2' に対応する) への文字列引数がありません。
30
+ warning C6271: 余分な引数が 'out_func' に渡されました: _Param_(3) は、書式文字列によって使用されていません。
31
+ 1>プロジェクト "ConsoleApplication1.vcxproj" のビルドが終了しました。
27
32
  ```
28
33
 
29
34
  ---

4

コード分析例追記

2020/08/05 08:38

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -18,10 +18,12 @@
18
18
  書式誤りの
19
19
  ```
20
20
  out_func("out sentence1 = %d", "one");
21
+ out_func("out sentence1 = %s", 1);
21
22
  ```
22
23
  に対するコード分析結果
23
24
  ```
24
25
  warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
26
+ warning C6067: _Param_(2) ('out_func' への呼び出し内) は文字列のアドレスでなければなりません。実際の型: 'int'
25
27
  ```
26
28
 
27
29
  ---

3

コード分析結果追記

2020/08/05 08:33

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -15,12 +15,22 @@
15
15
  }
16
16
  ```
17
17
 
18
+ 書式誤りの
19
+ ```
20
+ out_func("out sentence1 = %d", "one");
21
+ ```
22
+ に対するコード分析結果
23
+ ```
24
+ warning C6273: 整数でない値が _Param_(2) として渡されました。'out_func' への呼び出しには整数が必要です。実際の型: 'const char [4]': ポインター値を渡す場合は、%p を使用してください。
25
+ ```
26
+
18
27
  ---
19
28
  可変引数テンプレート版
29
+ 可変引数テンプレートの場合は`_Printf_format_string_`をつけてもチェックしてくれないようです…
20
30
  ```C++
21
31
  #include <vector>
22
32
  template <class...Args>
23
- void out_func(_Printf_format_string_ const char* format, Args...args) {
33
+ void out_func(const char* format, Args...args) {
24
34
  int len = _scprintf(format, args...) + 1;
25
35
  std::vector<char> buffer(len * sizeof(char));
26
36
  sprintf_s(&buffer[0], len, format, args...);

2

コード追記

2020/08/05 08:29

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -13,4 +13,17 @@
13
13
  va_end(args);
14
14
  std::cout << &buffer[0] << std::endl;
15
15
  }
16
+ ```
17
+
18
+ ---
19
+ 可変引数テンプレート版
20
+ ```C++
21
+ #include <vector>
22
+ template <class...Args>
23
+ void out_func(_Printf_format_string_ const char* format, Args...args) {
24
+ int len = _scprintf(format, args...) + 1;
25
+ std::vector<char> buffer(len * sizeof(char));
26
+ sprintf_s(&buffer[0], len, format, args...);
27
+ std::cout << &buffer[0] << std::endl;
28
+ }
16
29
  ```

1

コード修正

2020/08/05 08:06

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -10,7 +10,7 @@
10
10
  int len = _vscprintf(format, args) + 1;
11
11
  std::vector<char> buffer(len * sizeof(char));
12
12
  vsprintf_s(&buffer[0], len, format, args);
13
+ va_end(args);
13
14
  std::cout << &buffer[0] << std::endl;
14
- va_end(args);
15
15
  }
16
16
  ```