从不同文件调用时,C ++ __TIME__是不同的

时间:2019-02-10 20:46:19

标签: c++ c macros preprocessor

在玩预定义的宏时遇到了这个奇怪的事情。 因此,基本上,当从不同文件调用from urllib.request import urlopen from bs4 import BeautifulSoup import requests lokacija="http://www.hep.hr/ods/bez-struje/19?dp=koprivnica&el=124" datum="12.02.2019" lokacija=lokacija+"&datum="+datum print(lokacija) r = requests.get(lokacija) print(type(str(r))) print(r.status_code) html = urlopen(lokacija) bsObj = BeautifulSoup(html.read(),'lxml') print("Datum radova:",datum) print("HEP područje:",bsObj.h3.get_text()) mj=[] adr=[] vri=[] hep_podrucje=bsObj.h3.get_text() for el in bsObj.select('div:is(.grad, .ulica, .kada)'): if 'grad' in el.get('class'): print (el.get_text()) mj.append(el.get_text()) elif 'ulica' in el.get('class'): print(el.get_text()) adr.append(el.get_text()) elif 'kada' in el.get('class'): print (el.get_text()) vri.append(el.get_text()) 时,会发生以下情况:
__TIME__ bug

反正我可以解决这个问题吗?还是为什么会这样?
我所做的只是__TIME__来自不同来源的不同功能。

3 个答案:

答案 0 :(得分:3)

  

或者为什么会这样?

从文档中

  

此宏扩展为一个字符串常量,该字符串常量描述预处理器的运行时间

如果源文件在不同的时间编译,那么时间将不同。

  

反正我可以解决这个问题吗?

您可以使用命令行工具来生成时间字符串,并将该字符串作为宏定义传递给编译器。这样,该命令编译的所有文件的时间将相同。

答案 1 :(得分:1)

要回答您的原始问题:__TIME__对于不同的文件将有所不同,因为它指定了特定文件的编译时间。

但是,您要问X-Y problem。要解决您实际要执行的操作:

如果需要编译时值,最好让您的 build 系统指定它。也就是说,使用make或您正在使用的任何方法,以某种方式生成随机种子,然后将其作为命令行选项传递给编译器,以定义您的 own 预处理器宏(例如{ {1}})。然后,您可以将其应用于您编译的所有 C文件,并根据需要使用每个文件gcc -DMY_SEED=$(random_value) ...

答案 2 :(得分:0)

好吧,我认为您的用例有点奇怪,但是在所有文件中获得相同时间的一种简单方法是在一个源文件中使用__TIME__,然后使用它来初始化全局变量:

compilation_time.h:

const char *compilation_time;

compilation_time.c:

#include "compilation_time.h"
const char *compilation_time = __TIME__;

more_code.c:

#include "compilation_time.h"
...
    printf("%s\n", compilation_time);

如果您真的想像注释中那样构造一个整数(因为它假定为ASCII,所以可能不可移植),您可以这样做

seed.h:

const int seed;

seed.c:

#include "seed.h"
const int seed = (__TIME__[0] - '0') + ...;

more_code.c:

#include "compilation_time.h"
...
    srand(seed);