簡體   English   中英

C預處理宏定義的優先級

[英]C Preprocessor Macros priority of define

我想在代碼中打印最后定義的宏:

#define VAR   1234

#undef  VAR
#define VAR   1111
int main(){

printf("%d",VAR);
while(1);
}

輸出為1111

如果我想在另一個庫中定義。

但是,當我在外部庫中重新定義VAR ,輸出是第一個定義的值。 就是這個:

iIn主要代碼:

#include "variable.h"

int main(){
   REDEFINE();
   printf("%d",VAR);
   while(1);
}

variable.h

#define VAR 1234
void REDEFINE(void);

variable.c

void REDEFINE(){
    #undef VAR
    #define VAR 1111
}

在這種情況下,輸出為1234 ,並且REDEFINE()函數未更改VAR值。 如何在variable.c更改宏變量而不必在主代碼中重新定義?

預處理程序是一個單階段轉換階段,僅在編譯代碼之前執行預執行令牌替換。

defineundef不是可執行語句,它們在程序完成編譯之前就完成了很久。

如果您想要一個可修改的值,則需要定義一個變量(具有靜態存儲持續時間)來保存它。 所以是一個不同的variable.c

static int value = 1234;

int set_value(int new) {
  int prev = value;
  value = new;
  return prev;
}

int get_value() {
  return value;
}

這不是預處理器的工作方式。 到編譯器運行時,預處理器的運行已結束。 所有這些都在程序執行時間之前完成-甚至在程序變成可以執行的程序之前。

VAR替換為12341111 ,即預處理器到達其中包含VAR的行時有效的那一個,因此編譯器根本看不到VAR :而是看到預處理器用於替換的數字。

REDEFINE()的調用無效:

void REDEFINE(){
#undef VAR
#define VAR 1111
}

當預處理程序到達新的#define行時,預處理程序指令VAR您正在編譯的轉換單元的空間中的VAR更改為1111

對於您確實必須重新定義許多宏並希望在一個文件中執行此操作的情況,我提供了一個答案。 但請仔細檢查。
這將成為維護地獄 我迷信使用undef是邪惡的,或者至少非常不幸。

不要嘗試在.c文件中進行undef-redefine。
在新的標頭中執行此操作。

REDEFINE.H:

#undef VAR
#define VAR 1111

main.c中:

#include <stdio.h>
#include "variable.h"
#include "REDEFINE.H"

int main(){
    //REDEFINE(); // not needed
    printf("%d",VAR);
    while(1); // This is of course not in your actual code,
    // make sure that there is a return statement instead.
}

暫無
暫無

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

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