预处理器指令在一行内如果

Fab*_*cio 2 c compiler-construction

我有这个功能

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;
}
Run Code Online (Sandbox Code Playgroud)

如果#if指令为false,则将其编译为

if (cur = scan_comm())
    return last;
Run Code Online (Sandbox Code Playgroud)

要么

if (cur = scan_comm());
return last;
Run Code Online (Sandbox Code Playgroud)

Gra*_*and 6

它将被编译,就好像禁用的行不存在一样,所以:

if (cur = scan_comm())
    return last;
Run Code Online (Sandbox Code Playgroud)

您应该使用大括号来明确您的意思.

if (cur = scan_comm())
{
    #if ENABLE_COMMENT_AS_TOKEN
    add_token(cur);
    #endif
}    
return last;
Run Code Online (Sandbox Code Playgroud)