4

void;Cで行を配置すると何をしますか? コンパイラはそれについて警告していますが、私は理解していません。このような行に void を配置できることのポイントは何ですか?

#include <stdio.h>

int main() {
        void;
        printf("word dude");
        return 1;
}

ええ

$ gcc -pedantic -ansi -Wall -Wextra eh.c -o eh
eh.c: In function 'main':
eh.c:4:2: warning: useless type name in empty declaration
$ ./eh
word dude

人々は私が尋ねていることを混乱させているようです: この行は何を意味するのですか? なぜ有効なのですか?

void;

不必要な議論を引き起こしているため、void キャストを削除しました。

4

6 に答える 6

2

最初に考えたのは K&R だったので、この質問に興味を持ちました。私は古い K&R の本 (Appendix A p.192) に戻って、宣言に関する宣伝文句を見つけました (転写):

8. 宣言

宣言は、C が各識別子に与える解釈を指定するために使用されます。それらは必ずしも識別子に関連付けられたストレージを予約するとは限りません。宣言には
フォーム
    宣言: 
        decl-specifier declarator-list opt ;

declarator-list 内の宣言子には、宣言される識別子が含まれます。decl-specifiers は、一連の型とストレージ クラスの指定子で構成されます。
    decl-specifiers: 
        type-specifier decl-specifiers opt
         sc-specifier decl-specifiers opt

これにより、デラレータ リストはオプションである (つまり、空にすることができる) と考えるようになります。

この混乱を次のページに追加すると、有効な型指定子の値のセットがリストされますが、voidはそれらの 1 つではありません。

これはまだ合法であるかもしれないという私の狭い解釈では(しかし時代遅れです) C.

于 2012-06-28T05:44:10.957 に答える
2
      void;                       // 1
      (void)printf("word dude");  // 2

最初のステートメントは無効なステートメントです: これは C ではありません。

2 番目のステートメントでは、(void)キャストによって、戻り値を破棄する意図が明確になります。もう 1 つの一般的な用途は、Lint などの静的分析ツールをサイレントにすることです。

于 2012-06-27T23:04:48.477 に答える
1
void;

そんなことをしても意味がありません。何もしません。

これは本から拾ったのですか?間違いに違いない。

あまり関係ありませんが、戻り値0は通常、プログラムが正常に終了したことを示すために使用され、その他の値は問題を示します (慣例による)

更新

別の行を追加したようです:

(void)printf("word dude");

これは - 前のものとは異なりvoid;- 関数の戻り値printf()(出力される文字数) を無視するようコンパイラーに明示的に指示し、警告メッセージがコンパイラーまたは lint などの他のツールのうるさい/ペダンティックな設定で文句を言わないようにします。

これは、一般的に頻繁に使用される関数では見られませんが、他の関数では見られる場合があります。

于 2012-06-27T22:48:47.930 に答える
0

void は C のデータ型として使用されますが、そういえば C の NOP に相当するアセンブリ言語は聞いたことがないので、行に void を単独で指定するのはおそらくエラーです。

于 2012-06-27T22:57:49.637 に答える
0

関数に引数を宣言する古いスタイルのように見えます。に相当しint main(void)ます。一部のコンパイラはまだそれを受け入れますが、一部のコンパイラは受け入れません。たとえば、このコードは、私が試した 2 つのコンパイラでコンパイルされます。

void main(i, j) {
    int;
    long;

    i = 12;
    j = 123456;
    printf("%d %d\n", i, j);
}

C 関数宣言の型なし引数への回答には、この場合のより正確な定義があります。

いずれにせよ、これは推奨されないので、関数を宣言する「通常の」方法に固執できますか? :)

于 2012-06-27T23:37:55.263 に答える
0

または他のタイプで変更voidすると、同じエラーが出力されます。int

voidは型であり、その型の後に何かが必要です。int後ろに変数(または関数)名を付けずに書くだけではまったく意味がありません。

于 2012-06-27T22:53:24.150 に答える