代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

更改测试用预处理器符号的值

  •  3
  • Navaneeth K N  · 技术社区  · 14 年前

    我正在编写一个动态增长的字符串缓冲区。我有以下内容 .c 文件。

    #ifndef STRBUF_GROWTH_SIZE
    #define STRBUF_GROWTH_SIZE 4096
    #endif
    

    我的代码使用这个常量来重新分配缓冲区。现在在测试中,我需要将这个值设置为一个较小的值,以便检查重新分配。我试着在 tests.cpp (所有的测试都在C++中使用UNITTEST ++)。

    #define STRBUF_GROWTH_SIZE 10
    TEST(StringBuffer)
    {
        struct strbuf *string = strbuf_init();
    
        strbuf_add(string, "first");
        CHECK_EQUAL("first", string->buffer);
        CHECK_EQUAL(5, string->length);
        CHECK_EQUAL(10, string->allocated);   /* this fails */
    
        strbuf_add(string, " second");
        CHECK_EQUAL("first second", string->buffer);
        CHECK_EQUAL(12, string->length);
        CHECK_EQUAL(20, string->allocated); /* this fails */
    
        strbuf_destroy(string);
    }
    

    我想知道为什么这个值没有变为10?我如何解决这个问题?

    有什么想法吗?

    2 回复  |  直到 9 年前
        1
  •  3
  •   Oliver Charlesworth    14 年前

    预处理是在源文件的基础上完成的(好吧,不是很好,但它已经足够接近了)。一 #define 在一个源文件中不会影响另一个源文件中的任何内容。

    你要么需要 #定义 在一个头文件中,您可以在测试期间用另一个头文件交换,或者需要参数化您的库(例如 strbuf_init(int growth_size) .

    或者,为什么不用长度为4096的字符串进行测试呢?然后您将测试实际的生产代码。

        2
  •  4
  •   paleozogt    14 年前

    这个 #define 在测试中,其他.c文件中的代码看不到。但是,您可以在构建中注入宏。与GCC一起 -D argument . 使用MSVC的cl-its /D argument .