質問編集履歴

5

追記

2017/08/05 13:09

投稿

strike1217
strike1217

スコア651

test CHANGED
File without changes
test CHANGED
@@ -196,6 +196,28 @@
196
196
 
197
197
  他にも方法があれば是非教えてください。
198
198
 
199
+ ```ここに言語を入力
200
+
201
+ int main() {
202
+
203
+ int (*p)() = set(0);
204
+
205
+ int (*r)() = set(1);
206
+
207
+
208
+
209
+ ((void (*)(void))p)();
210
+
211
+ printf("%d\n", r(1,40));
212
+
213
+ return 0;
214
+
215
+ }
216
+
217
+ ```
218
+
219
+ こちらの方が分かりやすいですかね・・・
220
+
199
221
 
200
222
 
201
223
  「追記2」_________________________________

4

追記

2017/08/05 13:08

投稿

strike1217
strike1217

スコア651

test CHANGED
File without changes
test CHANGED
@@ -198,7 +198,7 @@
198
198
 
199
199
 
200
200
 
201
- 「追記2」_____________________
201
+ 「追記2」_________________________________
202
202
 
203
203
  あ、この場合は未定義ではないのかな?
204
204
 

3

追記

2017/08/05 12:31

投稿

strike1217
strike1217

スコア651

test CHANGED
File without changes
test CHANGED
@@ -195,3 +195,33 @@
195
195
  間違いがあったらご指摘ください。
196
196
 
197
197
  他にも方法があれば是非教えてください。
198
+
199
+
200
+
201
+ 「追記2」_____________________
202
+
203
+ あ、この場合は未定義ではないのかな?
204
+
205
+
206
+
207
+ 「型変換されたポインタを関数呼出しに用い,関数の型がポインタが指すものの型と適合しない場合,その動作は未定義とする。 」
208
+
209
+
210
+
211
+ となっているようなので、**呼び出しの際に元の型へ戻しておけば動作は未定義ではない**
212
+
213
+ ということだと思います。
214
+
215
+
216
+
217
+ 型を別のものにキャストして呼び出した場合の話なので、
218
+
219
+
220
+
221
+ **とある型 → 別の型にキャスト → 元の型にキャスト → 呼び出し** なら大丈夫!!
222
+
223
+ **とある型 → 別の型にキャスト → 呼び出し** これはダメ!!
224
+
225
+
226
+
227
+ という事ですかな?

2

追記

2017/08/05 12:30

投稿

strike1217
strike1217

スコア651

test CHANGED
File without changes
test CHANGED
@@ -156,7 +156,7 @@
156
156
 
157
157
  else
158
158
 
159
- return (int (*)(void))funcs;
159
+ return (int (*)(void))funcs; //一度キャストしておく
160
160
 
161
161
  }
162
162
 
@@ -164,7 +164,7 @@
164
164
 
165
165
  int main() {
166
166
 
167
- void (*p)() = (void (*)(void))set(0);
167
+ void (*p)() = (void (*)(void))set(0); // キャストして元に戻す
168
168
 
169
169
  int (*r)() = set(1);
170
170
 

1

追記

2017/08/05 12:18

投稿

strike1217
strike1217

スコア651

test CHANGED
File without changes
test CHANGED
@@ -115,3 +115,83 @@
115
115
 
116
116
 
117
117
  実験環境は、Windows 64bit visual studio cl オプションなし です。
118
+
119
+
120
+
121
+ 「追記」___________________________
122
+
123
+ Saitoさんの回答とコメントを元に作ってみました。
124
+
125
+ こんな感じですかね・・・・
126
+
127
+
128
+
129
+ ```C
130
+
131
+ #include<stdio.h>
132
+
133
+
134
+
135
+ int func(int a, int b) {
136
+
137
+ return a + b;
138
+
139
+ }
140
+
141
+
142
+
143
+ void funcs(void) {
144
+
145
+ printf("Hello in funcs\n");
146
+
147
+ }
148
+
149
+
150
+
151
+ int (*set(int c))() {
152
+
153
+ if (c)
154
+
155
+ return func;
156
+
157
+ else
158
+
159
+ return (int (*)(void))funcs;
160
+
161
+ }
162
+
163
+
164
+
165
+ int main() {
166
+
167
+ void (*p)() = (void (*)(void))set(0);
168
+
169
+ int (*r)() = set(1);
170
+
171
+
172
+
173
+ p();
174
+
175
+ printf("%d\n", r(1,40));
176
+
177
+ return 0;
178
+
179
+ }
180
+
181
+ ```
182
+
183
+
184
+
185
+ Warning, Error共になく、正常に動作しています。
186
+
187
+ maisumakunさんの回答を見ると、**未定義とされている**ので怖いのですが・・・・
188
+
189
+
190
+
191
+ これぐらいしか方法がなさそうです。
192
+
193
+
194
+
195
+ 間違いがあったらご指摘ください。
196
+
197
+ 他にも方法があれば是非教えてください。