1. ホーム
  2. c

[解決済み] POSIXシステムでargcを0にすることは可能か?

2023-05-24 17:26:18

質問

メインプログラムの標準的な定義が与えられています。

int main(int argc, char *argv[]) {
   ...
}

どのような状況で argc は POSIX システム上ではゼロになりますか?

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

はい、可能です。 以下のようにプログラムを呼び出すと

execl("./myprog", NULL, (char *)NULL);

あるいは交互に

char *args[] = { NULL };
execv("./myprog", args);

続いて、"myprog"で。 argc は0になります。

標準の は、特に 0 argc を使用することも可能です。これは、ホスト環境でのプログラムの起動に関して 5.1.2.2.1 節で述べたとおりです。

1 プログラム起動時に呼び出される関数の名前は main . この実装では,この関数のプロトタイプは宣言されていない。この関数は の戻り値で定義されなければなりません。 int で、パラメータなしで定義されなければならない。

int main(void) { /* ... */ } 

または2つのパラメータ(ここでは argcargv しかし,それらは宣言された関数に対して局所的であるため,どのような名前でも使用することができます。 であるため、どのような名前でも使うことができます。)

int main(int argc, char *argv[]) { /* ... */ }

またはそれと同等の方法、あるいは他の実装で定義された方法で行います。

2 宣言されている場合、パラメータは main 関数へのパラメータは,次の制約に従わなければならない。

  • の値は argc は非負でなければならない。
  • argv[argc] はヌルポインタでなければならない。

...

また、このことは、もし argc が 0 ならば argv[0] はNULLであることが保証されています。 どのように printf の引数として使われたとき、NULLポインタをどう扱うか? %s 指定子の引数として使用された場合、NULLポインタをどう扱うかは、標準では明文化されていません。 多くの実装ではこの場合 "(null)" と出力されますが、保証されているわけではありません。