如何使用#ifndef只在函数内执行一部分代码?

时间:2017-10-13 15:19:56

标签: c ifndef

//static int initialized;
void print(struct student *arg) {
  #ifndef first_call
  #define first_call 1
  //if (!initialized) {
    //initialized = 1;
    printf("sizeof(*arg1): %lu\n", sizeof(*arg));
  //}
  #endif
  ...
}

我想在if块中只执行一次代码行。

当然我知道如何通过不同方式(评论部分)来做到这一点。

但我想知道为什么我的代码无法正常工作。

感谢。

2 个答案:

答案 0 :(得分:3)

编译期间将发生预处理程序指令。意思是,在你的程序运行之前,它将需要:

//static int initialized;
void print(struct student *arg) {
  #define first_call 1
  //if (!initialized) {
    //initialized = 1;
    printf("sizeof(*arg1): %lu\n", sizeof(*arg));
  //}
  ...
}

然后把它变成:

first_call

这意味着,你打算不会发生什么。您只需将initialized定义为1.

void print(struct student *arg) { static bool initialized = false; if (!initialized) { initialized = true; printf("sizeof(*arg1): %lu\n", sizeof(*arg)); } ... } 这样的临时变量是一个很好的解决方案,可以让它运行一次。请记住,退出此函数调用后,局部变量将被销毁。提示:查找静态变量 ..

这样可行:

 std::map< Int_t, std::vector<Double_t> > MapOfEventsAndMasses;

 for(int i=0; i<tree->GetEntries();i++){ //loop through the data 
 tree->GetEntry(i);

 if(MapOfEventsAndMasses.find(event_number) == MapOfEventsAndMasses.end()){

 std::vector<Double_t> tempVec;  
 tempVec.push_back(DiLept_M); 
 }
 else{
   MapOfEventsAndMasses[event_number].push_back(DiLept_M);
 }



 std::map< Int_t, std::vector<Double_t> >::iterator Iter1; 



   Iter1 = MapOfEventsAndMasses.begin();  


   std::map< Int_t, std::vector<Double_t> >::iterator Iter1_End;

   Iter1_End = MapOfEventsAndMasses.end(); 

   for ( ; Iter1 != Iter1_End; Iter1++){  

Int_t event_number = Iter1->first;  

std::vector<Double_t> DiLept_M = Iter1->second; 




          for( int j=0; j < DiLept_M.size(); i++){


    // NOT SURE WHAT TO DO HERE


      }

   }  //Closing for loop

答案 1 :(得分:0)

你走错了路。 #ifdef是预处理器命令,在编译器之前解析。这意味着如果不满足条件,则在编译之前简单地删除放置在#ifdef块内的所有内容。

对于您的特定问题,使用静态变量的常用方法之一是:

int my_func()
{
    static int initialized = 0;

    if (!initialized)
    {
        /* Initialize */
        ...

        initialized = 1;
    }

    ...
}