//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块中只执行一次代码行。
当然我知道如何通过不同方式(评论部分)来做到这一点。
但我想知道为什么我的代码无法正常工作。
感谢。
答案 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;
}
...
}