1. ホーム
  2. c

[解決済み] この難読化されたC言語コードはmain()なしで実行されると主張しているが、実際には何をするのか?

2023-06-29 19:31:25

疑問点

#include <stdio.h>
#define decode(s,t,u,m,p,e,d) m##s##u##t
#define begin decode(a,n,i,m,a,t,e)

int begin()
{
    printf("Ha HA see how it is?? ");
}

これは間接的に main をどのように呼び出すのですか?

どのように解決するのですか?

C言語では、実行環境を2つに分類しています。 自立型 主催の . どちらの実行環境でも、プログラム起動のための関数が環境から呼び出されます。

において 自立型 環境では、プログラム起動関数を実装することができます。 ホスト型 環境では main . C言語のプログラムは、定義された環境でのプログラム起動機能なしには実行できません。

あなたの場合 main はプリプロセッサの定義で隠されています。 begin() に展開されます。 decode(a,n,i,m,a,t,e) に展開され、さらに main .

int begin() -> int decode(a,n,i,m,a,t,e)() -> int m##a##i##n() -> int main() 


decode(s,t,u,m,p,e,d) は 7 つのパラメータを持つパラメータ化されたマクロです。このマクロの置換リストは m##s##u##t . m, s, u そして t は4 th , 1 st , 3 rd および2 nd というパラメータが置換リストで使用されます。

s, t, u, m, p, e, d
1  2  3  4  5  6  7

残りは不要( を難読化するだけ ). に渡される引数は decode は " です。 a , n , i , m ,a,t,e" というわけで、識別子の m, s, ut は引数に置き換えられます m, a, in のように、それぞれ

 m --> m  
 s --> a 
 u --> i 
 t --> n