[英]Why doesn't the preprocessor's token pasting operator ## work on variables?
[英]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
問題是, VGA
和NVGA
在哪里定義?
如果未定義它們,則根據C標准(N1570-6.10.1條件包含-第4段),它們將等於0
:
在執行了由於宏擴展和定義的一元運算符引起的所有替換之后,所有剩余的標識符(包括在詞法上與關鍵字相同的標識符)都被替換為pp-number 0,然后將每個預處理令牌轉換為令牌。
這意味着您的比較將是#if 0==0
,與#if 1
相同。
要解決此問題,您需要同時定義VGA
和NVGA
以具有不同的值:
#define VGA 1
#define NVGA 2
有兩種可能性,我不知道是哪一種。 最有可能的是,由於NVGA
和VGA
都不是#define
d宏,因此它們在#if
中都被評估為零,因此被視為相等。 (這是語言的規定。)第二種可能性是系統的stdio.h
或conio.h
將NVGA
定義為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”),則您的問題是第一個。 如果您遇到有關重新定義NVGA
或VGA
的錯誤,則問題是第二個問題。
因為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.