我理解运行时和编译时之间的区别以及如何区分这两者,但我没有看到需要区分编译时和运行时依赖.
我正在窒息的是:程序如何在编译期间不依赖运行时依赖的东西?如果我的Java应用程序使用log4j,那么它需要log4j.jar文件才能编译(我的代码集成并调用log4j内部的成员方法)以及运行时(我的代码完全无法控制log4j中的代码后发生的事情) .jar跑了).
我正在阅读依赖解析工具,如Ivy和Maven,这些工具清楚地区分了这两种类型的依赖关系.我只是不明白它的必要性.
任何人都可以给出一个简单的,"国王的英语"式的解释,最好有一个实际的例子,即使像我这样的可怜的人也能理解?
在C(而不是C++)中实现编译时静态断言的最佳方法是什么,特别强调GCC?
Java中的编译时间和运行时依赖性有什么区别?它与类路径有关,但它们有何不同?
在编译C或C++代码时,找出CPU架构最可靠的方法是什么?据我所知,不同的编译器有自己的一套非标准预处理器定义(_M_X86
在MSVS中__i386__
,__arm__
在GCC 中等).
有没有一种标准的方法来检测我正在构建的架构?如果没有,是否有各种编译器的这种定义的综合列表的来源,例如包含所有样板#ifdef
的标题?
我正在编写一些用于解析一些文本数据文件的模板类,因此很可能绝大多数的解析错误都是由于数据文件中的错误造成的,这些错误大部分都不是由程序员编写的,因此需要关于为什么应用程序无法加载的好消息,例如:
解析example.txt时出错.[MySectiom] Key的值("notaninteger")不是有效的int
我可以计算出从传递给在类模板函数和成员瓦尔参数文件,段和键名,但我不知道如何让模板函数试图转换为类型的名称.
我当前的代码看起来像,只有普通字符串的特殊化,如下:
template<typename T> T GetValue(const std::wstring §ion, const std::wstring &key)
{
std::map<std::wstring, std::wstring>::iterator it = map[section].find(key);
if(it == map[section].end())
throw ItemDoesNotExist(file, section, key)
else
{
try{return boost::lexical_cast<T>(it->second);}
//needs to get the name from T somehow
catch(...)throw ParseError(file, section, key, it->second, TypeName(T));
}
}
Run Code Online (Sandbox Code Playgroud)
Id而不是必须为数据文件可能使用的每种类型进行特定的重载,因为它们有很多...
此外,我需要一个不会产生任何运行时开销的解决方案,除非发生异常,即完全编译时解决方案是我想要的,因为这个代码被称为吨次并且加载时间已经变得有点长.
编辑:好的,这是我提出的解决方案:
我有一个类型h包含以下内容
#pragma once
template<typename T> const wchar_t *GetTypeName();
#define DEFINE_TYPE_NAME(type, name) \
template<>const wchar_t *GetTypeName<type>(){return name;}
Run Code Online (Sandbox Code Playgroud)
然后我可以在我需要处理的每种类型的cpp文件中使用DEFINE_TYPE_NAME宏(例如,在定义要开始的类型的cpp文件中).
然后链接器能够找到适当的模板特化,只要它在某处定义,否则抛出链接器错误,以便我可以添加类型.
我需要将编译脚本中的一些信息传递给Template Haskell.目前编译脚本将信息保存在系统环境中,所以我只是使用System.Environment.getEnvironment
wrap in来读取它runIO
.有没有更好的方法,例如传递一些参数ghc
(类似于-D...
C预处理器),或者也许是为TH专门为此目的而设计的东西?
我正在尝试使用Xcode 10进行编译时转移到新的构建系统.但是,它会出现以下错误:
Cycle details:
? Target 'project' : LinkStoryboards
Target 'project' has compile command with input '/Users/project/Commons/Components/ScreenshotSharing/ViewController/AppShare.storyboard'
Target 'project' : ValidateEmbeddedBinary /Users/project/Xcode/DerivedData/project-hgqvaddkhmzxfkaycbicisabeakv/Build/Products/Debug-iphoneos/project.app/PlugIns/stickers.appex
Target 'project' has process command with input '/Users/project/Resources/Info.plist'
Target 'project' has compile command with input '/Users/project/Commons/Components/ScreenshotSharing/ViewController/AppShare.storyboard'
Run Code Online (Sandbox Code Playgroud)
即使在删除问题文件后,我也可以使用另一个xib/storyboard.如何在不恢复遗留构建系统的情况下解决此错误?
由于在运行时可能会调用声明为constexpr的函数,编译器在哪个条件下决定是在编译时还是在运行时计算它?
template<typename base_t, typename expo_t>
constexpr base_t POW(base_t base, expo_t expo)
{
return (expo != 0 )? base * POW(base, expo -1) : 1;
}
int main(int argc, char** argv)
{
int i = 0;
std::cin >> i;
std::cout << POW(i, 2) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我在编译时是未知的,这可能是编译器将POW()视为在运行时调用的常规函数的原因.然而,这种动态虽然看起来很方便,但却具有一些不切实际的含义.例如,是否有一种情况我希望编译器在编译时计算constexpr函数,编译器决定将其视为普通函数,而它在编译时也会工作?有任何已知的常见陷阱吗?