在编译时将文本文件导入原始字符串文字

时间:2016-05-18 06:51:54

标签: c++ resources c-preprocessor

我有一个包含我的应用程序所需资源的文本文件。该文件包含任意纯文本,带有变量赋值的C ++代码。我不想将文本文件与我的应用程序一起发送;我宁愿把它编成它。所以我尝试了以下内容:

#include <iostream>
#include <string>

int main() {
    std::string test = R"(
#include <textresource.txt>
)";
    std::cerr << test << std::endl;
}

我希望第6行中的#include在预处理时执行,并替换为资源文件的内容。之后,编译器将看到带有资源数据的原始字符串文字。

但是,输出只是文本#include <textresource.txt>,并带有换行符。显然,#include永远不会被执行。 (我正在使用Visual Studio 2015。)

为什么#include没有按预期工作?是否有其他语法在编译时将文本文件(而不是代码)导入变量?

2 个答案:

答案 0 :(得分:4)

  

为什么#include的工作没有按预期进行?

C ++标准版2.2翻译阶段列出了步骤:

  
      
  1. 源文件被分解为预处理令牌(2.4)......
  2.   

(在2.4预处理令牌下,您会发现 string-literals 是令牌类型之一)

  
      
  1. 执行预处理指令
  2.   

因此,将包含文本"#include..."的字符串文字正确地标记为字​​符串文字,而不是任何需要执行预处理指令的内容。

  

是否有其他语法会在编译时将文本文件(而不是代码)导入变量?

不适合C ++语言。您当然可以在构建系统中编排这个...调用一些shell或实用程序来拼接您想要的C ++源代码。特定的C ++编译器可以提供非标准的工具来促进这一点;您需要查看您感兴趣的编译器的文档。

答案 1 :(得分:0)

我不确定textresource.txt的内容是什么。但你可以这样做。

文件textresource.c

#include <string>
static std::string myString {"Very large string content ........ you may be need proper escape character depending on your content."};

文件main.cpp

#include <iostream>
#include <string>
#include "textresource.c"
int main() {
    std::string test = myString;
    std::cerr << test << std::endl;
}