質問編集履歴
5
追記
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
追記
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
追記
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
追記
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
追記
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
|
+
他にも方法があれば是非教えてください。
|