c++ - 如何让 C 预处理器在编译期间执行代码?

标签 c++ c-preprocessor

我目前正在从事一个代码项目,该项目要求我将某些字符串替换为这些字符串的哈希值。由于这些字符串不会在运行时更改,因此让 C 预处理器在我声明要在编译时进行哈希处理的每个字符串上运行我的哈希函数在效率方面是有利的。

有没有办法让 C 预处理器在编译时运行我的哈希函数?

我知道这不会像我上面描述的那样工作,但为了了解我要去哪里,这里有一些使用宏的伪代码。想象一下,预处理器不是简单地扩展宏,而是运行哈希函数并将其扩展为该哈希函数的返回值:

    #include <iostream>
    #include <string>

    #define U64_HASH(inputString) getU64HashCode(inputString)

    //my hash function
    unsigned long long getU64HashCode (string inputString)
    {
        /*code*/
    }

    int main()
    {
        cout << U64_HASH("thanks for helping me") << endl;
        return 0;
    }

同样,理想情况下 cout << U64_HASH("thanks for helping me") << endl;将扩展为 cout << 12223622566970860302 << endl;

我写了一个头文件生成器,对于这个项目来说效果很好。

最终解决方案

我决定使用 John Purdy's perl script对于这个项目,因为它简直太棒了,并且允许我将我想要的输出直接提供给我的编译器。非常感谢,约翰。

最佳答案

完成此操作的一种方法是将所有字符串放入头文件中,并命名它们:

// StringHeader.h
#define   helloWorld              "Hello World"
#define   error_invalid_input     "Error: Invalid Input"
#define   this_could_get_tedious  "this could get tedious"

然后你可以使用这些字符串:

#include "StringHeader.h"
std::cout << this_could_get_tedious << std::endl;

然后您可以在 StringHeader.h 上运行一个程序来散列每个字符串,并生成一个替换头文件:

// Generated StringHeader.h
#define   helloWorld              097148937421
#define   error_invalid_input     014782672317
#define   this_could_get_tedious  894792738384

乍一看,这看起来非常手动和乏味,但有办法让它自动化。

例如,您可以编写一些东西来解析您的源代码,寻找“带引号的字符串”。然后它可以命名每个字符串,将其写入单个 StringHeader.h,并用新的命名字符串常量替换内联引号字符串。作为创建文件时的附加步骤,您可以散列每个字符串 - 或者您可以在创建文件后一次性获得该文件。这可以让您创建文件的散列和非散列版本(创建非散列调试版本和散列发布版本可能很好)。

如果您尝试这样做,您最初寻找字符串的解析器将不得不处理边缘情况(注释、#include 行、重复的字符串等)。

关于c++ - 如何让 C 预处理器在编译期间执行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7605286/

相关文章:

c++ - 关于抽象工厂和注入(inject)的问题

c++ - 如何检查 SWIG 接口(interface)文件中的 Lua 版本?

objective-c - 有没有办法检查 C 或 Objective-C 中的宏 "expands"

c - #include <...> 项的顺序在 C 中很重要吗?

c++ - "#define"与 "#define 1"

c++ - 试图了解C++ STL容器的初始化

c++ - clang++ - 将模板类名视为类范围内的模板

c++ - 如何将结构元素传递给异步线程?

python - 使用 Python 制作预处理器

c++ - 操作系统 : Symbols not found for architecture i386