質問「関数へのポインタを返す関数」のSaitoAtsushiさんの回答で
他の方の回答では
void*
を使うという提案もありますが、厳密に言えば言語仕様上は関数ポインタはvoid*
よりも大きい幅である可能性があるのでお勧めできません。
と述べています。私は今まで全てのポインタは同じ大きさであると信じており、すべてはvoid *
へキャストでき、また、void *
にキャストされたポインタは元の型に(もちろん同じであるある必要がありますが)キャストできると思っていました。でも、関数ポインタの場合はどうやら異なるようです。
そこで、どのような環境において、どのように異なるのか、また、そのときのintptr_t
との関係はどうなるのか(そもそもないとか、void *
に合わせてあるとか)について教えてください。
なお、手元の環境(Win10+Visual Studio 2017、Win10+MSYSY2+Mingw-w64 GCC、Bash on Ubuntu on Windows+GCC、Bash on Ubuntu on Windows+Clang)で下記のコードを試したのですが、32bitでは全て4、64bitでは全て8と、異なる幅であることは確認できませんでした。
C
1#include <stdint.h> 2#include <stdio.h> 3 4int main(void) 5{ 6 printf("%zu\n", sizeof(void *)); 7 printf("%zu\n", sizeof(int *)); 8 printf("%zu\n", sizeof(double *)); 9 printf("%zu\n", sizeof(void (*)(void))); 10 printf("%zu\n", sizeof(int (*)(int))); 11 printf("%zu\n", sizeof(intptr_t)); 12 return 0; 13}
その他、N1570のp.580に
J.5.7 Function pointer casts
1 A pointer to an object or to void may be cast to a pointer to a function, allowing data to be invoked as a function (6.5.4).
2 A pointer to a function may be cast to a pointer to an object or to void, allowing a function to be inspected or modified (for example, by a debugger) (6.5.4).
とありましたが、互換性のための国際標準を示す付録なので言語仕様外なのかも知れません。C++の仕様は確認できていないです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。