みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

C++で関数の中に関数を作る?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

C++で関数の中に関数を作る?

投稿記事 by みけCAT » 9年前

C言語では、GCC拡張で関数の中に関数を作れます。

CODE:

#include 

int main(void) {
	int add(int a, int b) {
		return a + b;
	}

	printf("%d\n", add(12, 34));
	return 0;
}
SchemeやHaskell, Pythonなどでも関数の中に関数を作れます。

CODE:

(define main (lambda ()
    (define add (lambda (a b) (+ a b)))
    (write (add 12 34)) (newline)
))

(main)

CODE:

main :: IO ()
main = let add a b = a + b -- いーたかんやく?いえ、知らない子ですね
       in putStrLn $ show $ add 12 34

CODE:

def main(argv):
    def add(a, b):
        return a + b
    print(str(add(12, 34)))

def target(*args):
	return main, None

if __name__ == '__main__':
	import sys
	main(sys.argv)
C++でも関数の中に関数のコードを書いてみました。

CODE:

#include 

int main(void) {
	int add(int a,int b);
	__asm__ __volatile__ (
		"jmp 1f\n\t"
		"Z3addii:\n\t"
		"_Z3addii:\n\t"
		"__Z3addii:\n\t"
		"pop %ecx\n\t"
		"pop %edx\n\t"
		"pop %eax\n\t"
		"push %eax\n\t"
		"push %edx\n\t"
		"push %ecx\n\t"
		"add %edx, %eax\n\t"
		"ret\n\t"
		"1:\n\t"
	);
	printf("%d\n", add(12, 34));
	return 0;
}
うーん、Ideone.comcodepadでは動くけどWandboxでは動かないし、コレジャナイ…。

アバター
しょこらふれっくす
記事: 66
登録日時: 13年前

Re: C++で関数の中に関数を作る?

投稿記事 by しょこらふれっくす » 9年前

関数内に構造体書いてそのメンバに静的関数作るのじゃ駄目なの?

アバター
nullptr
記事: 239
登録日時: 12年前

Re: C++で関数の中に関数を作る?

投稿記事 by nullptr » 9年前

(インラインアセンブラは)アカン