【问题标题】:How can I create a common file between JavaScript and C/C++ for a constant?如何在 JavaScript 和 C/C++ 之间为常量创建一个通用文件?
【发布时间】:2011-05-17 13:20:00
【问题描述】:

我有一个 C++ 程序,头文件中包含以下内容: #define VARIABLE_X 100

此外,还有一个 JavaScript 文件,其全局为:VARIABLE_X = 100;

这些值必须始终相同。

我不需要在两个地方(.h 和 .js)都更改它们,而是需要一个公共文件,两者都可以获取此值,因此只需要在一个地方进行更改。

如何在 JavaScript 和 C/C++........ 之间为 #define/constant 创建一个通用文件?

谢谢。

【问题讨论】:

  • +1,在没有好的解决方案之前,我已经面临跨语言常量存储的困境。
  • Jason,您对 Anon 的回答有何看法?这是一个比你结束的更好的解决方案吗?还是真的没有办法在两者之间建立“共享文件”与构建生成文件?

标签: javascript c++ c configuration


【解决方案1】:

您有一个实际的脚本驱动构建过程,对吧?

如果constants.js 已更改,只需在您的makefile 中添加一条规则,该规则将重新生成constants.h

【讨论】:

  • +1。但是,当您使用它时,请在 C++ 程序中使用实常数:'const int VARIABLE_X = 100;' (或任何合适的类型而不是'int')而不是#define。 #define 是文字复制和粘贴。使用实际的语言功能(如果存在)。
  • 匿名,请原谅我在构建过程中缺乏知识,但是否可以更改 JS 中的特定变量并让它更新生成文件规则中 .h 中的特定#define?请您详细说明一下。谢谢。
  • @Tommy:在 VS 中,如果您转到 Project 页面,然后转到 Build 选项卡,您可以定义构建前和构建后的步骤。您在预构建部分中设置的任何内容都将由 Visual Studio 在实际构建之前运行 - 因此您可以编写一个快速程序来获取 JS 文件,并基于该文件创建新的头文件,并自动拥有 Visual Studio每次构建项目时都这样做。
  • @Karl Knechtel:好点子,但我会更进一步声明static const int VARIABLE_X = 100; - 否则你可能会得到链接器会拒绝的多个定义(正确地)。
【解决方案2】:

您使用的是什么构建系统?构建系统是这类东西的好地方。

【讨论】:

  • Ding old school CGI on Visual Studio(服务器端代码)和 JavaScript/HTML,基本上,在记事本中。 (是的,我知道)
  • @Tommy 我不是微软工具方面的专家,但我很确定它实际上可以在 VS 构建系统中完成。
  • +1。即使对于您自己运行的初级项目,构建系统也是一种胜利,原因有很多。
  • 那么VS中有一些选项可以做到这一点吗?这种类型的选项叫什么?
【解决方案3】:

此方法对每种数据类型使用单独的文件,但允许您在 C/C++ 标头中包含特殊格式的 javascript 文件。

您可以在 C/C++ 中使用 #define 宏来根据需要更改标识符。对于 javascript,显而易见的候选者是 var,因为它仅在 javascript 中需要......它可以根据任何 c 类型的需要重新定义。通常我不建议在javascript中使用new Array(),但是由于C/C++使用{...}来初始化数组,而javascript使用[...],这是一个必要的邪恶,允许你包装它们。

c-header.h

//constant integers
#define var const int
#include "int-consts.js"
#undef var

//constant strings
#define var const char*
#include "string-consts.js"
#undef var

//arrays of strings
#define var const char**
#define new (const char*[])
#define Array(...)  {__VA_ARGS__}
#include "string-arrays.js"
#undef new
#undef var

//and so forth for other types

int-consts.js

var swapMagicOffset = 4086;

string-consts.js

var swapMagic = "SWAP-SPACE";
var swapMagic2 = "SWAPSPACE2";

字符串数组.js

var cars = new Array("Ford", "Chevy", "Dodge");

编辑: 进一步考虑,您可以做的不仅仅是保持常量同步。您甚至可以使用两种语言之间鲜为人知的差异编写可以同时作为 javascript 和 C 运行的代码。在 C 中,您可以使用在下一行继续的 '\',从而允许我们使用 *\newline/ 结束 C 中的注释(使用 -Wno-comment 编译以忽略 Clang 中的警告),但由于 js 不遵循相同的规则,它会一直作为注释继续,直到找到实际的 '*/' 标记。

/* C comment ends with the '/' on next line but js comment is open  *\
/ //BEGIN C Block
#define function int
/* This ends the original js comment, but we add an opening '/*' for C  */

/*Most compilers can build K&R style C with parameters like this:*/
function volume(x,y,z)/**\
/int x,y,z;/**/{return x*y*z;}

/**\
/
#undef function
/**/

【讨论】:

    【解决方案4】:

    你不能,有很多原因。但是有一个简单的解决方案:有一个函数可以从常量中生成一个 Javascript 文件,并在您的 Javascript 中动态加载它。

    一些简单的事情:

     printf("VARIABLE_X = %d;\n", VARIABLE_X);
    

    如果成为维护麻烦,您可以编写一个简单的函数来生成一些通用格式的 .h 文件和 .js 文件。

    【讨论】:

    • 从来没想过。要加载这个生成的 javascript,只需将其包含在 html 中,还是有另一种方法可以在我当前的 JavaScript 中“加载”它?谢谢。
    • 很大程度上取决于您工作的环境。ASP.NET? php?姜戈?其他环境?如果您使用 C++,这听起来像是某种自定义环境。最后我看到人们这样做是CGI。但我可能错过了一些东西。
    • 哦,我刚看到你上面的评论,你使用的是低级CGI。在这种情况下,只需将
    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多