簡體   English   中英

包含頭文件中的C預處理器

[英]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指令。被執行。

來自: http : //www.cplusplus.com/doc/tutorial/preprocessor/

除錯字(typdef)外,您的示例對我來說使用gcc可以很好地編譯。

編輯:新的示例不應該編譯。 您需要在#ifdef指令中包裝對“ x”的所有引用。

另外,gcc在文件列表之前接受-D標志,但我無權訪問MIPSpro。 文檔說您的命令行混亂。

暫無
暫無

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

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