![](/img/trans.png)
[英]How to include multiple directories to search header files in C preprocessor
[英]C preprocessor in include header files
我有一個在名為data.h的頭文件中定義的結構。
我將data.h包含在myfile.c中。
在結構中,我將部分變量用:
#ifndef TEST
int x;
#endif
在myfile.c中,我有:
#ifdef TEST
localx++;
#else
mystruct.x++; //<-compiler complains on this line when compiling
#endif
當我嘗試使用-DTEST
進行編譯時,出現編譯器抱怨mystruct
類型不包含名為x
的字段。 這怎么了?
我沒有C編譯器,所以這里是我剛輸入的內容:
在data.h中
typdef struct {
#ifndef TEST
int x;
#endif
int y;
} coords;
在myfile.c中
#include "data.h"
static coords coord1;
int localx;
int main( )
{
#ifdef TEST
localx = 1;
#else
coord1.x = 1;
#endif
coord1.y = 2;
printf("%i\n", coord1.x);
printf("%i\n", coord1.y);
printf("%i\n", localx);
return 0;
}
當我鍵入cc myfile.c
而不是cc myfile.c -DTEST
時, cc myfile.c -DTEST
編譯。我正在使用此處引用的MIPSPro C編譯器。
您最近的編輯(在任何人閱讀此書時,可能會有所不同)將在具有一堆printf()
語句的部分中出現問題。 該行:
printf("%i\n", coord1.x);
無論TEST
預處理器宏的設置如何,都引用結構的x
成員。 當x
成員不存在時,它也必須在條件編譯部分中才能正確編譯(而不是根本不編譯)。
由於您在字段x中使用ifndef,因此只有在未定義TEST的情況下才可以使用它!
#ifdef允許僅在定義了指定為參數的宏的情況下編譯程序的一部分,而不管其值是什么。 例如:
#ifdef TABLE_SIZE
int table[TABLE_SIZE];
#endif
在這種情況下,代碼行int table [TABLE_SIZE]; 僅當先前使用#define定義TABLE_SIZE時,才對其進行編譯,而與它的值無關。 如果未定義,則該行將不包含在程序編譯中。
#ifndef的作用恰恰相反:#ifndef和#endif指令之間的代碼僅在指定的標識符先前未定義時才編譯。 例如:
#ifndef TABLE_SIZE
#define TABLE_SIZE 100
#endif
int table[TABLE_SIZE];
在這種情況下,如果在到達這段代碼時尚未定義TABLE_SIZE宏,則將其定義為值100。如果已經存在,則它將保留其先前的值,因為不會定義#define指令。被執行。
除錯字(typdef)外,您的示例對我來說使用gcc可以很好地編譯。
編輯:新的示例不應該編譯。 您需要在#ifdef指令中包裝對“ x”的所有引用。
另外,gcc在文件列表之前接受-D標志,但我無權訪問MIPSpro。 文檔說您的命令行混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.