ts101 #工作记录 #c/c++ #学习

在开发过程中为了增加程序的可移植性, 代码的复用是关键, 为了后面算法在 QT 上的无缝使用, 我们对多文件编译, 同时建立我们的调试头文件将一些调试信息用宏管理.

多文件编译

  • 我们增加一个自定义的 math.c 文件里面增加一个 add 函数, 并定义开放的.
  • 具体函数查看 git 项目
  • 在编译时会报 'add [_add]' referenced from '.\Debug\helloworld.doj' 的错误, 这是因为 math.c 没有加入项目
  • 项目右键 Add File(s) to Project 将头文件和源文件加入项目, 并保存项目 image.png.
  • 之后编译即可正常运行.

    调试头文件定义

    为了快速对 printf 进行控制处理, 我们需要对调试函数做新的宏定义.

  • 我们先需要了解一些 ANSI C标准宏

    1. __LINE__; // 在源码中插入当前源代码行号
    2. __FILE__; // 在源码中插入当前文件名
    3. __DATE__; // 在源码中插入编译日期
    4. __TIME__; // 在源码中插入编译时间
    5. __VA_ARGS__;
  • 编写头文件定义 ```c

    ifdef PRINT

    include

    define INFO(FMT,…) printf(“[INFO]”FMT, ##VA_ARGS)

    define WARN(FMT,…) printf(“[WARN]”FMT, ##VA_ARGS)

    define ERROR(FMT,…) printf(“[ERROR]|%s:%d|”FMT,FILE,LINE,##VA_ARGS )

    else

    define INFO(FMT,…)

    define WARN(FMT,…)

    define ERROR(FMT,…)

    endif

if (defined PRINT) && (defined DEBUG)

define DEBUG(FMT,…) printf(“[DEBUG]”FMT, ##VA_ARGS)

define DEBUGI(FMT,…) printf(“[DEBUG]|%s:%d|”FMT,FILE,LINE,##VA_ARGS )

else

define DEBUG(FMT,…)

define DEBUGI(FMT,…)

endif

  1. - 修改所有的 printf DEBUG, 同时建立如下测试函数
  2. ```c
  3. void testDebugFunc(void) {
  4. DEBUG("TestSize: %d\n", sizeof(a));
  5. DEBUGI("TestSize: %d\n", sizeof(a));
  6. INFO("TestSize: %d\n", sizeof(a));
  7. WARN("TestSize: %d\n", sizeof(a));
  8. ERROR("TestSize: %d\n", sizeof(a));
  9. }
  • 现在运行程序可以看到我们啥也看不见. 因为我们没有定义 __PRINT____DEBUG__
  • Project -> Project Options 找到 Perprocessor 页面, 在第一行中加入 __PRINT__

image.png

  • 可以看到只有 INFO WRN 和 ERROR 输出了

image.png

  • 再加入 __DEBUG__ 注意要和之前的变量有一个空格. 可以看到 DEBUG 信息已经正常输出

image.png

[问题]修复一个 Warning

warning 信息如下:

cc1080 warning: Function does not have a full prototype

我已经在文件开头对函数做了声明, 但是还有这个问题. 将被调用的函数放在文件前面, 即可解决此文件. 【详情看 helloworld.c 文件】

[问题]出现编译的文件不存在

由于我们将一个头文件从 helloworld.c 中移除, 这时编译会出现找不到头文件问题.
image.png
解决思路有两种

  • 手动去 .mak 文件中, 需要的这个头文件删除
  • 将 .c 文件移除项目再加入

    项目属性研究

    我们看到的项目有 Release Debug, 不同的项目可以配置不同的项目属性.

  • 在 Debug 里我们可以配置上 DEBUG PRINT 参数

  • 在 Release 里我们可以配置上 PRINT 参数
  • 新建一个 Burning 我们应该将所有打印信息清除.