天道酬勤,学无止境

How can I use language files with custom messages with preprocessor constants?

I want to have all CustomMessages in language files (extension isl). Also, some of the messages contain preprocessor constants, e.g.

ALREADY_INSTALLED={#MyAppName} is already installed on this computer.

The message should be displayed like this:

"My-really-nice-App is already installed on this computer"

But what I get is:

"{#MyAppName} is already installed on this computer."

The following works like a charm when I have the code, the message defined in a [CustomMessages]-topic and #define MyAppName in the same iss file:

MsgBox(ExpandConstant('{cm:ALREADY_INSTALLED}'), ...);

Any clues?

评论

Only .iss file is preprocessed, not .isl files.

But you can use FmtMessage function:

FmtMessage(CustomMessage('ALREADY_INSTALLED'), ['{#MyAppName}'])

With

ALREADY_INSTALLED=%1 is already installed on this computer.

Note that in Pascal Script code, you better use CustomMessage('FOO'), instead of ExpandConstant('{cm:FOO}').


Similar question: Pass parameters to custom messages defined in .isl files.

If you need to preprocess the standard messages, see Can I use .isl files for the messages with preprocessor directives in Inno Setup?

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • C/C++ #define详解
    #define预处理器指令和其他预处理器指令一样,以#号作为一行的开 始。ANSI和后来的标准都允许#号前面有空格或制表符,而且还允许在#和 指令的其余部分之间有空格。但是旧版本的C要求指令从一行最左边开始, 而且#和指令其余部分之间不能有空格。 指令可以出现在源文件的任何地 方,其定义从指令出现的地方到该文件末尾有效。我们大量使用#define指令来定义明示常量(manifest constant)(也叫做符号常量),但是该指令还有许多其他用途。 **预处理器指令从#开始运行,到后面的第1个换行符为止。**也就是说,指令的长度仅限于一行。然而,前面提到过,在预处理开始前,编译器会把多行物理行处理为一行逻辑行。 程序清单16.1 preproc.c程序 /* preproc.c -- 简单的预处理示例 */ #include <stdio.h> #define TWO 2   /* 可以使用注释 */ #define OW "Consistency is the last refuge of the unimagina\ tive.- Oscar Wilde" /* 反斜杠把该定义延续到下一行 */ #define FOUR TWO*TWO #define PX printf("X is %d.\n", x) #define FMT "X is %d.\n" int main
  • 为什么#define不需要分号?(Why does #define not require a semicolon?)
    问题 我正在用C编写一些测试代码。 我误插入了; 在#define ,这给了我错误。 为什么#define不需要分号? 进一步来说 : 方法1:有效 const int MAX_STRING = 256; int main(void) { char buffer[MAX_STRING]; } 方法2:不起作用-编译错误。 #define MAX_STRING 256; int main(void) { char buffer[MAX_STRING]; } 这些代码行为不同的原因是什么? 这两个MAX_STRING都不都是常量吗? 回答1 #define是预处理程序指令,而不是C语法定义的语句或声明(两者均需以分号结尾)。 每个语法的规则都不同。 回答2 #define MAX_STRING 256; 方法: 只要在预处理时找到MAX_STRING,就将其替换为256; 。 在您的情况下,它将使方法2: #include <stdio.h> #include <stdlib.h> #define MAX_STRING 256; int main(void) { char buffer [256;]; } 这是无效的语法。 代替 #define MAX_STRING 256; 和 #define MAX_STRING 256 两种代码之间的区别在于,在第一种方法中
  • 将C预处理程序用于C以外的语言(Using the C Preprocessor for languages other than C)
    问题 C预处理程序的Wikipedia条目指出: 预处理程序指令的语言与C的语法无关,因此C预处理程序也可以独立用于处理其他类型的文件。 如何才能做到这一点? 有什么例子或技巧吗? 编辑:是的,我对宏处理最感兴趣。 即使它不建议或不可维护,但知道可行的方法仍然很有用。 回答1 您可以直接致电CPP: cpp <file> 而不是通过gcc调用它: gcc -E filename 但是请注意,正如同一Wikipedia文章中所述,C预处理程序的语言并没有真正适合通用用途: 但是,由于C预处理器不具有某些其他预处理器的功能,例如递归宏,根据引用的选择性扩展,条件中的字符串评估和Turing完整性,因此与更通用的宏处理器(例如m4)相比,它非常受限制。 。 您是否考虑过尝试使用更灵活的宏处理语言,例如上述的m4? 回答2 例如,汇编程序。 尽管许多汇编程序都有自己的#include头文件和#define宏的方法,但为此使用C预处理器可能会很有用。 例如,在将* .s文件提供给GNU汇编程序(“ as”)之前,GNU make具有通过运行预处理器('cpp')将* .S文件转换为* .s文件的隐式规则。 回答3 是的,可以通过gcc预处理程序(例如'gcc -E')解析您自己的语言来完成此操作。 我们已经用我们的特定语言在工作中做到了这一点。 它具有很多优点: 您可以使用C的包含语句(
  • 如何在汇编中访问C预处理程序常量?(How to access C preprocessor constants in assembly?)
    问题 如果我在C .h文件中定义一个常量: #define constant 1 如何在我的Assembly .s文件中访问它? 回答1 如果您使用GNU工具链,则默认情况下,gcc将在带有.S扩展名(大写“ S”)的文件上运行预处理器。 因此,您可以在汇编文件中使用所有cpp功能。 有一些警告: 汇编器和预处理器对输入进行标记的方式可能有所不同。 如果您#include头文件,则它们仅应包含预处理器指令,而不应包含C函数之类的C语言。 您不应该使用#注释,因为它们会被预处理程序解释。 例子: 文件定义.h #define REGPARM 1 文件汇编 #include "definitions.h" .text .globl relocate .align 16 .type relocate,@function relocate: #if !REGPARM movl 4(%esp),%eax #endif subl %ecx,%ecx ... 即使您不使用gcc,您也可以使用相同的方法,只要您的汇编程序的语法与C预处理程序具有合理的兼容性(请参见上面的注意事项)。 大多数C编译器都可以选择仅预处理输入文件(例如,gcc中的-E ),或者您可以将预处理器作为单独的可执行文件。 您可能可以在组装之前将此预处理包括在构建工具中。 回答2 除非有特定的开发链允许,否则您将无法这样做。
  • C ++宏什么时候有益? [关闭](When are C++ macros beneficial? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想要改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 2年前关闭。 改善这个问题 C预处理程序被C ++社区合理地恐惧和回避。 内联函数,const和模板通常是#define的更安全,更高级的替代方法。 以下宏: #define SUCCEEDED(hr) ((HRESULT)(hr) >= 0) 绝对不优于安全类型: inline bool succeeded(int hr) { return hr >= 0; } 但是宏确实有其位置,请列出您在没有预处理器的情况下无法发现的宏的用途。 请把每个用例放在一个单独的答案中,以便可以将其投票。如果您知道如何在没有预告的情况下获得答案之一,请指出该答案的注释方式。 回答1 作为调试功能的包装器,可自动传递__FILE__ , __FILE__ __LINE__等内容: #ifdef ( DEBUG ) #define M_DebugLog( msg ) std::cout << __FILE__ << ":" << __LINE__ << ": " << msg #else #define M_DebugLog( msg ) #endif 回答2 方法必须始终是完整的,可编译的代码; 宏可以是代码片段。 因此,您可以定义一个foreach宏:
  • 在C#代码中重用.h文件中的define语句(Reuse define statement from .h file in C# code)
    问题 我有C ++项目(VS2005),其中在#define指令中包含具有版本号的头文件。 现在,我需要在双胞胎C#项目中包括完全相同的数字。 最好的方法是什么? 我正在考虑将此文件作为资源包含,然后在运行时使用正则表达式进行解析以恢复版本号,但是也许有更好的方法,您认为呢? 我无法将版本移到.h文件之外,而且构建系统依赖于它,而C#项目是应适应的项目。 回答1 只需几个步骤,您就可以实现所需的功能: 创建MSBuild任务-http://msdn.microsoft.com/zh-cn/library/t9883dzc.aspx 更新项目文件以包括对在构建之前创建的任务的调用 该任务会接收一个参数,该参数包含您引用的标头.h文件的位置。 然后,它将提取版本并将该版本放入您先前创建的C#占位符文件中。 或者您可以考虑使用AssemblyInfo.cs来保存版本(如果适合的话),它通常包含版本。 如果您需要其他信息,请随时发表评论。 回答2 我会考虑使用.tt文件来处理.h并将其转换为.cs文件。 它非常简单,源文件将成为您的C#解决方案的一部分(意味着它们将随着.h文件的更改而刷新),可以单击以在编辑器中打开等。 如果您只有1 #define,则可能有点过大,但是如果您有一个充满它们的文件(例如,可能是mfc resource.h文件),则此解决方案将大获成功。 例如
  • 使用Swift的CocoaLumberjack-调用预处理器宏(CocoaLumberjack with Swift - Calling preprocessor macros)
    问题 我开始使用新的编程语言Swift构建IOS应用程序。 我设法使用CocoaPods,并能够在AppDelegate.swift中使用CustomLoggerFormatter(Objective-C)成功创建DDTTYLogger,并将其附加到记录器中。 var customLoggerFormatter = CustomLoggerFormatter() var consoleLogger: DDTTYLogger = DDTTYLogger.sharedInstance() consoleLogger.setLogFormatter(customLoggerFormatter) DDLog.addLogger(consoleLogger) 但是问题是,CocoaLumberjack库正在对记录器方法使用预处理器宏,例如DDLogVerbose(@"..") 在DDLog.h中定义: #define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, LOG_LEVEL_DEF, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) 有什么变通办法可以使预处理器定义在Swift中工作吗? 还是有人尝试过类似的尝试获得更多成功? 回答1 好吧,我刚刚找到了解决方案。
  • 如何在编译时让 GCC 评估函数?(How to make GCC evaluate functions at compile time?)
    问题 我正在考虑以下问题:我想用使用某种查找表的程序对微控制器(比如说AVR mega类型)进行编程。 最初的尝试是将表放置在单独的文件中,并使用任何其他脚本语言/程序/ ...创建它。在这种情况下,要为C创建必要的源文件付出了相当大的努力。 我现在的想法是使用预处理器和编译器来处理事情。 我试图用一个正弦值表来实现这一点(仅作为示例): #include <avr/io.h> #include <math.h> #define S1(i,n) ((uint8_t) sin(M_PI*(i)/n*255)) #define S4(i,n) S1(i,n), S1(i+1,n), S1(i+2,n), S1(i+3,n) uint8_t lut[] = {S4(0,4)}; void main() { uint8_t val, i; for(i=0; i<4; i++) { val = lut[i]; } } 如果我编译这段代码,我会收到关于sin函数的警告。 进一步在程序集中, .data部分没有任何内容。 如果我只是删除第三行中的sin ,我会在程序集中获得数据。 显然,所有信息在编译时都可用。 你能告诉我是否有办法实现我的意图:编译器计算尽可能多的离线值? 或者是使用外部脚本/程序/...来计算表条目并将它们添加到一个单独的文件中的最佳方法,该文件将只是#include d?
  • 如何在预处理器宏中使用“ sizeof”?(How can I use “sizeof” in a preprocessor macro?)
    问题 有什么方法可以在预处理器宏中使用sizeof吗? 例如,多年来,我想做很多事情,例如: #if sizeof(someThing) != PAGE_SIZE #error Data structure doesn't match page size #endif 我在这里检查的确切内容完全构成了-重点是,我经常喜欢放入这些类型的(大小或对齐)编译时检查,以防止有人修改数据结构而导致对齐或重新对齐的情况。大小会破坏它们的东西。 不用说-我似乎无法以上述方式使用sizeof 。 回答1 有几种方法可以做到这一点。 如果sizeof(someThing)等于PAGE_SIZE ,则以下代码片段将不产生任何代码; 否则会产生编译时错误。 1. C11方式 从C11开始,您可以使用static_assert(需要#include <assert.h> )。 用法: static_assert(sizeof(someThing) == PAGE_SIZE, "Data structure doesn't match page size"); 2.自定义宏 如果您只是想在sizeof(something)不是您期望的值时出现编译时错误,则可以使用以下宏: #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*
  • 常量C表达式是在编译时还是在运行时求值的?(Are constant C expressions evaluated at compile time or at runtime?)
    问题 如果我编写了一个#define来使用其他预处理器常量执行操作,那么每次在运行时宏出现时,最终值是否都会计算出来? 这是否取决于编译器中的优化,或者它是否包含在标准中? 例子: #define EXTERNAL_CLOCK_FREQUENCY 32768 #define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY #define TIMER_100_MS TIMERB_1_S / 10 每次都会10分之32768在运行期间发生的操作我用的是TIMER_100_MS宏? 我想避免以下情况: #define EXTERNAL_CLOCK_FREQUENCY 32768 #define TIMER_1_S EXTERNAL_CLOCK_FREQUENCY #define TIMER_100_MS 3276 概括 要求编译器能够评估常量整数表达式,因为它们对于在编译时计算数组大小之类的内容是必需的。 但是,该标准仅表示他们“可以”(而不是“必须”)这样做。 因此,只有脑筋急转弯的编译器在编译时不会评估常量整数表达式,而对非常规编译器的汇编输出进行简单检查将验证每种情况。 回答1 宏是简单的文本替换,所以在你的例子写TIMER_100_MS的计划是写的一个奇特的方式32768 / 10 。 因此,问题是编译器何时会评估32768 / 10
  • #define 命名空间中的语句(#define statements within a namespace)
    问题 如果我在命名空间中有一个 #define 语句: namespace MyNamespace { #define SOME_VALUE 0xDEADBABE } 我说#define 语句不限于命名空间是否正确? 以下是“正确”的事情吗? namespace MyNamespace { const unsigned int SOME_VALUE = 0xDEADBABE; } 回答1 正确, #define不受命名空间的约束。 #define是一个预处理器指令 - 它导致在通过编译器编译之前对源文件进行操作。 在编译步骤期间使用命名空间,编译器无法洞察#define 。 您应该尽量避免使用预处理器。 对于这样的常量值,更喜欢 const 而不是#define 。 回答2 我完全同意有关使用常量的建议,并且#define的范围不受限制。 但是,如果您确实必须使用预处理器#define行,请在预期范围内正确覆盖它们, namespace MyNamespace { #define SOME_VALUE 0xDEADBABE // your code #undef SOME_VALUE } 为什么#defines ? 我知道一种嵌入式平台不支持代码中的常量的情况。 没有办法初始化它们...... 它总是有助于提高可读性。 回答3 预处理器在命名空间和其他语言级概念“启动”之前运行
  • Dart中有编译器预处理器吗?(Is there a compiler preprocessor in Dart?)
    问题 由于在启动dart应用程序之前需要进行编译,因此我想知道编译器预处理器是否可用,或者在不久的将来会针对Dart进行调度。 到目前为止,我在dart网站上的网上搜索都没有成功。 (通过预处理程序,我的意思是: #define max(A,B) ( (A) > (B) ? (A):(B)) 或者 : #define NumType double #define NumTypeZero 0.0 // used with : NumType myNum = NumTypeZero; 或者 : #define DEBUG // use #ifdef DEBUG print('var1 : $var1, var2:$var2, ...'); #endif ) 编辑:我想知道为什么还没有预处理器,因为从那时起我们似乎“近在咫尺”: -Dart必须扫描文件中的库依赖性,才能以正确的顺序加载库。 -Dart编辑器还会扫描文件的语法,类型检查和其他检查。 -可能在编辑器中启动了一些自动文件处理功能(我找不到与此相关的有价值的链接,如果有的话,请告诉我)。 回答1 基本上其他人说的... 如果您使用dart2js进行编译,那么如果DEBUG为常量且为false,那么摇摇晃晃的代码将把if(DEBUG){}块内的代码扔掉。 因此,您可以只使用if语句。 您也可以使用assert()语句。
  • 限制#define 标签的范围(Limit scope of #define labels)
    问题 限制#define标签的范围并避免不必要的令牌冲突的正确策略是什么? 在以下配置中: 主文件 # include "Utility_1.h" # include "Utility_2.h" # include "Utility_3.h" VOID Main() { ... } Utility_1.h # define ZERO "Zero" # define ONE "One" BOOL Utility_1(); // Uses- ZERO:"Zero" & ONE:"One" Utility_2.h # define ZERO '0' # define ONE '1' BOOL Utility_2(); // Uses- ZERO:'0' & ONE:'1' Utility_3.h const UINT ZERO = 0; const UINT ONE = 1; BOOL Utility_3(); // Uses- ZERO:0 & ONE:1 注: Utility _1 , Utility_2和Utility_3已经独立编写 错误:宏重定义和令牌冲突此外,最令人担忧的是:编译器没有指出什么替换了令牌替换的内容 {Edit}注意:这是一个通用问题,所以请不要提出enum或const 即什么时候做什么:我必须使用#define & _请在下面评论我提出的解决方案.. __
  • C ++-枚举vs.常量vs.#定义(C++ - enum vs. const vs. #define)
    问题 在本文结尾处:http://www.learncpp.com/cpp-tutorial/45-enumerated-types/,其中提到了以下内容: 最后,与常量变量一样,枚举类型也会显示在调试器中,这使得它们在#方面比#defined值更有用。 上面的黑体字是如何实现的? 谢谢。 回答1 考虑一下这段代码, #define WIDTH 300 enum econst { eWidth=300 }; const int Width=300; struct sample{}; int main() { sample s; int x = eWidth * s; //error 1 int y = WIDTH * s; //error 2 int z = Width * s; //error 3 return 0; } 显然,每个乘法都会导致编译错误,但请查看GCC如何为每个乘法错误生成消息: prog.cpp:19:错误:“ eWidth * s”中的“ operator *”不匹配 prog.cpp:20:错误:'300 * s'中的'operator *'不匹配 prog.cpp:21:错误:“宽度* s”中的“运算符*”不匹配 在错误消息中,您看不到已#defined的宏WIDTH ,对吗? 那是因为当GCC尝试编译对应于第二个错误的行时,它没有看到WIDTH
  • 《C++ Primer(第5版)》第二章笔记
    第二章——变量和基本类型 2.1 基本内置类型2.1.2 类型转换2.1.3 字面值常量 2.2 变量2.2.1 变量定义2.2.2 变量声明和定义的关系2.2.3 标识符2.2.4 名字的作用域 2.3 复合类型2.3.1 引用2.3.2 指针2.3.3 理解复合类型的声明 2.4 const限定符2.4.1 const引用2.4.2 指针和const2.4.3 顶层const2.4.4 constexpr和常量表达式 2.5 处理类型2.5.1 类型别名2.5.2 auto类型说明符2.5.3 decltype类型指示符 2.6 自定义数据结构2.6.1 定义Sales_data类型2.6.2 使用Sales_data类2.6.3 编写自己的头文件 小结 数据类型是程序的基础:它告诉我们 数据的意义 以及我们能在数据上执行的操作 2.1 基本内置类型 算数类型空类型:不对应任何具体值 算数类型的尺寸在不同机器上有所差别。表2.1列出了C++标准规定的尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。 浮点型可表示单精度、双精度和扩展精度值。C++标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度。通常,float以1个字(32比特)来表示,double 以2个字(64 比特)来表示,long double以3或4个字(96或128比特)来表示。一般来说
  • C语言学习笔记知识点齐全——新手入门必看【建议收藏】
    终身受益的700个网站【史上最全】——建议收藏“卑微的小丑”总有一个可以帮助你!!! https://blog.csdn.net/liu17234050/article/details/105092333 目录: 一:C语言编辑软件 二:小提示 三:C语言简介 1.简介 2.特点 3.关于C 4.语言标准“C11” 新特性 四:C语言程序结构 实例1: 五:编译 & 执行 C 程序 六:C语言32个关键字 七:C语言数据类型 八:C语言中的变量和常量的区别用法 九:C语言中的判断语句 十:C语言中的循环语句 1.循环类型 2.循环控制语句 十:C 语言中的函数定义及用法 十一:C 语言中的数组定义及用法 十二:C 语言中的enum(枚举) 十三:C 语言中的指针定义及用法 十四:C 语言中的结构体&位域 十五:C 语言中的共用体 十六:C 语言文件的——打开_关闭_写入_读取_fseek 十七:C 语言中的预处理器 十八:C 语言中的头文件 十九:C 语言中的错误处理 二十:C 语言中的递归 二十一:C 语言中的可变参数 二十二:C 语言中的内存管理 二十三:C 语言中的六种排序算法 二十四:C 语言经典200道实例 一:C语言编辑软件 【C语言编辑软件】VC6.0++下载 链接:-《推荐》 https://pan.baidu.com/s/164xWOOe7ZL9
  • #定义VS变量(#Define VS Variable)
    问题 我无法理解以下两者之间的区别是什么: #define WIDTH 10 和 int width = 10; 使用第一个或第二个有什么好处? 回答1 好吧,两者之间有很大的不同。 您可以更改width的值,可以获取其地址,可以要求其大小等等。 使用WIDTH ,它将随处都被常量10取代,因此++WIDTH表达式没有任何意义。 在另一边,您可以声明带有WIDTH项的数组,而不能声明带有width项的数组。 总结一下: WIDTH的值在编译时是已知的,不能更改。 编译器不会为WIDTH分配内存。 相反, width是一个初始值为10的变量,它的其他值在编译时未知。 变量从编译器获取其内存。 回答2 两者有什么区别? 第一个是宏,第二个是变量声明。 #define WIDTH 10是预处理程序指令,它允许您指定名称( WIDTH )及其替换文本( 10 )。 预处理程序将解析源文件,并且每次出现的名称都会被其关联的文本替换。 编译器根本不会真正看到宏名称,它看到的是被替换的文本。 变量声明由编译器本身评估。 它告诉编译器声明一个名为width且类型为int的变量,并使用值10对其进行初始化。 编译器通过其自己的名称width知道此变量。 您应该选择哪一个? 又为什么呢? 通常,建议在#define上使用编译时常量变量。 因此,您的变量声明应为: const int width =
  • C/C++编程笔记:C语言入门知识点(一),请收藏C语言最全笔记!
    C语言简介 C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的。C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现。 在 1978 年,布莱恩·柯林汉(Brian Kernighan)和丹尼斯·里奇(Dennis Ritchie)制作了 C 的第一个公开可用的描述,现在被称为 K&R 标准。 UNIX 操作系统,C编译器,和几乎所有的 UNIX 应用程序都是用 C 语言编写的。由于各种原因,C 语言现在已经成为一种广泛使用的专业语言。 易于学习。 结构化语言。 它产生高效率的程序。 它可以处理底层的活动。 它可以在多种计算机平台上编译。 环境设置 这是只说明在 MAC 上怎么使用 C 语言来进行开发,环境的话需要用到 GCC 进行编译,你可以下载并安装 Xcode 工具,一旦安装上 Xcode,您就能使用 GNU 编译器。开发工具你可以使用 Xcode 或者 CLion 都可以,看个人喜好。我这里用的是 CLion 工具,你可以发现 CLion 页面跟使用风格包括快捷键都跟 AndroidStudio 一样。上手极其容易。 1. 程序结构 我们先来看一下最简单的一个 C 程序,先来打印一个 “HelloWorld”。代码如下: #include <stdio.h> /** * C 语言入口程序 *
  • 设计字符串本地化的最佳方法(Best way to design for localization of strings)
    问题 这有点一般性的问题,可以征求意见。 我一直试图为Windows MFC应用程序和相关实用程序的字符串资源本地化设计一种好方法。 我的愿望清单是: 必须在代码中保留字符串文字(而不是用宏#define资源ID进行替换),以便消息仍可内联读取必须允许本地化的字符串资源(duh) 不得施加其他运行时环境限制(例如:对.NET的依赖等) 对现有代码的干扰应最小(修改越少越好) 应该是可调试的应生成可通过通用工具(即:通用格式)进行编辑的资源文件不应使用复制/粘贴注释块将原义字符串保留在代码中,或其他可能引起不同步的内容允许静态(编译时)检查资源文件中的每个“注释”字符串都很好允许跨语言资源字符串池(对于各种语言的组件,例如:本机C ++和.NET)将是很好的 除了静态检查,我有某种方式可以满足我所有的愿望清单,但是我必须开发一些自定义代码来实现它(并且有局限性)。 我想知道是否有人以一种特别好的方式解决了这个问题。 编辑:我目前拥有的解决方案如下所示: ShowMessage( RESTRING( _T("Some string") ) ); ShowMessage( RESTRING( _T("Some string with variable %1"), sNonTranslatedStringVariable ) ); 然后,我有一个自定义实用程序,用于从“ RESTRING
  • 深入理解计算机系统(1.1)------Hello World 是如何运行的
    深入理解计算机系统(1.1)------Hello World 是如何运行的  上一篇序章我谈了谈 程序员为啥要懂底层计算机结构 ,有人赞同也有人反对也好,这都是博主的个人见解,但是博客还是要坚持学下去。这篇博客以案例驱动的模式,通过跟踪一个简单 Hello World 程序的生命周期开始系统的学习,包括它被程序员创建,到在系统上运行,输出简单的消息,然后终止。LZ 将沿着这个程序的声明周期,先简要的介绍一些逐步出现的关键概念、专业术语以及组成部分。后面将会详细展开。  1、计算机系统  我们知道计算机系统是由硬件和软件组成的。它们共同工作来运行应用程序。虽然系统的实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件,它们执行着相似的功能,我们只有深入了解这些组件是如何工作的,以及这些组件是如何影响程序的正确性和性能的,才能写出高质量的代码。 2、万能程序大法----Hello World#includeint main() { printf("Hello World\n"); return 0;//c标准规定建议main函数返回值为int }    这段代码不用多说,就是一个C语言的Hello World,程序的执行结果是打印 “Hello World”。 3、信息的表示  我们将上面的 Hello World 程序保存在一个 hello