簡體   English   中英

為什么#if預處理程序不起作用?

[英]Why doesn't #if preprocessor work?

使用以下代碼,當我打算獲取“ NOT VGA”時,我總是得到“ VGA”作為輸出

#include<stdio.h>
#include<conio.h>
#define ADAPTER NVGA
#if ADAPTER==VGA
 int main()
 {
 printf("VGA");
 getch();
 return 0;
 }
#else
     int main()
 {
 printf(" NOT VGA");
 getch();
 return 0;
 }
 #endif

問題是, VGANVGA在哪里定義?

如果未定義它們,則根據C標准(N1570-6.10.1條件包含-第4段),它們將等於0

在執行了由於宏擴展和定義的一元運算符引起的所有替換之后,所有剩余的標識符(包括在詞法上與關鍵字相同的標識符)都被替換為pp-number 0,然后將每個預處理令牌轉換為令牌。

這意味着您的比較將是#if 0==0 ,與#if 1相同。

要解決此問題,您需要同時定義VGANVGA以具有不同的值:

#define VGA  1
#define NVGA 2

有兩種可能性,我不知道是哪一種。 最有可能的是,由於NVGAVGA都不是#define d宏,因此它們在#if中都被評估為零,因此被視為相等。 (這是語言的規定。)第二種可能性是系統的stdio.hconio.hNVGA定義為VGA

要找出哪個,請編譯該程序並查看會發生什么:

#include <stdio.h>
#include <conio.h>
/* these numbers are chosen at random */
#define NVGA 8446
#define VGA 13060
#define ADAPTER NVGA
int main(void)
{
#if ADAPTER == VGA
    puts("VGA");
#else
    puts("NOT VGA");
#endif
    getch();
    return 0;
}

如果它產生您期望的輸出(即“ NOT VGA”),則您的問題是第一個。 如果您遇到有關重新定義NVGAVGA的錯誤,則問題是第二個問題。

因為NVGA本身尚未定義。 而是嘗試以下方法:

#define NVGA 0
#define VGA 1

#define ADAPTER VGA

#if ADAPTER==VGA
  /* insert VGA code here*/
#else
  /* insert NVGA code here*/
#endif

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM