2

私はこの機能を持っています

TOKENP scan_line() {
    TOKENP cur, last = 0;

    while(cur = scan_opd())
        last = cur;

    if (cur = scan_comm())
    #if ENABLE_COMMENT_AS_TOKEN
        add_token(cur);
    #endif
    return last;
}

#ifディレクティブが falseの場合、次のようにコンパイルされますか?

if (cur = scan_comm())
    return last;

また

if (cur = scan_comm());
return last;

?

4

2 に答える 2

6

無効な行が存在しないかのようにコンパイルされるため、次のようになります。

if (cur = scan_comm())
    return last;

中括弧を使用して、意味を明確にする必要があります。

if (cur = scan_comm())
{
    #if ENABLE_COMMENT_AS_TOKEN
    add_token(cur);
    #endif
}    
return last;
于 2012-10-02T13:14:28.743 に答える
0

そのコードをコンパイルするので、returnステートメントは条件付きになります。意味:

if(cur = scan_comm())
  return last;

グラハム・ボーランド、これは正しいのですが、問題が何であるかが明確になっていることを確認したいと思います。これを見てください:

int somef(int a)
{
    if(a == 0)
#if something
    a++; 
#endif
    return 0;
}

int main() {
    int a = 3;
    int b = 10;

    b = somef(a); 

    printf("b is %d\n", b);
    ...do more useful stuff with b...

このコードをコンパイルするとgcc -Werror -Wall、「制御が非void関数の終わりに到達する」などのように失敗するはずです。これにより、コードに問題があることが通知されます。

安全オプションなしでコンパイルすると、警告なしでコンパイルされる可能性があります。これですべてが正常だと思いますが、このサンプルコードsomethingではコードが定義されていないため、そのコードはなくなり、関数呼び出しから「0」が返されません。この特定のケースでは、bに3が割り当てられました。

ここでは、いくつかの未定義の動作に入りました。さて、bを使って「便利なこと」をしていると、元々は0だったと思っていたので、値が「3」だった理由を理解するのに非常に苦労します。

角かっこを使用するのは常に安全です。

if (cur = scan_comm())
    add_token(cur);

return last;

対。

if (cur = scan_comm())
{
    add_token(cur);
}

return last;

これらはどちらも同じように機能しますが、2番目は愚かな間違いから保護するのに役立ちます。

于 2012-10-02T13:49:25.203 に答える