欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C 编程环境搭建 Window 篇

程序员文章站 2023-12-21 22:44:10
前言 - 简介 我们在写代码的过程中, 不可避免的重度依赖所处的开发环境. 本文重点带大家在 Window 搭建 C 简单控制台项目. 当作存档, 用于记录项目搭建各种重复操作. 在详细过程之前, 我们约定下基础环境 Best new version Window Best new version ......

前言 - 简介

  我们在写代码的过程中, 不可避免的重度依赖所处的开发环境. 本文重点带大家在 window 搭建 c

简单控制台项目. 当作存档, 用于记录项目搭建各种重复操作.  在详细过程之前, 我们约定下基础环境

  best new version window

  best new version visual studio

例如笔者当前是 windows 10 + visual studio 2019, 其中 windows 推荐开启 utf-8 支持. 

C 编程环境搭建 Window 篇

那此间, 骚年去唤醒自己的道 ~ 

 

正文 - 过程

  正文分三个过程. 其一是 visual studio c consule 常用设置. 其二是导出模板, 来解放生产力. 其三演示使用.

visual studio c consule 常用设置

1. 创建 c_template 项目

C 编程环境搭建 Window 篇  

C 编程环境搭建 Window 篇

 

2. 只保留 x64 环境

C 编程环境搭建 Window 篇

人的精气有限, 做钉子更省力.

3. 添加基础 main.c

C 编程环境搭建 Window 篇

4. visual studio 项目详细配置

a). 区域环境配置

项目右击 -> [配置属性] -> [高级] -> [字符集] -> [未设置]

b). 添加包含库
项目右击 -> [配置属性] -> [链接器] -> [输入]

psapi.lib
user32.lib
shell32.lib
ws2_32.lib
userenv.lib
iphlpapi.lib
advapi32.lib

c). 添加预编译处理器
项目右击 -> [配置属性] -> [c/c++]-> [预处理器] -> [预处理器定义]

[debug]
_debug

[release]
ndebug
 
_largefile_source
_file_offset_bits=64
win32_lean_and_mean
_crt_secure_no_warnings
_crt_nonstdc_no_deprecate
_winsock_deprecated_no_warnings

d). 设置编译额外选项
项目右击 -> [配置属性] -> [c/c++] -> [常规] -> [调试信息格式] -> [程序数据库 (/zi)]
项目右击 -> [配置属性] -> [c/c++] -> [代码生成] -> [运行库] -> [多线程/mt]
项目右击 -> [配置属性] -> [c/c++] -> [高级] -> [编译为] -> [编译为c代码/tc]
项目右击 -> [配置属性] -> [c/c++] -> [高级] -> [禁用特定警告] -> [4098]
项目右击 -> [配置属性] -> [c/c++] -> [命令行] -> [/d "restrict=__restrict"]
项目右击 -> [配置属性] -> [链接器] -> [常规] -> [启用增量链接] -> [否 (/incremental:no)]
项目右击 -> [配置属性] -> [链接器] -> [系统] -> [子系统] -> [控制台]
项目右击 -> [配置属性] -> [链接器] -> [命令行] -> /ignore:4099
 
详细配置遇到不明白可以自行搜索, 可以图了解, 也可以求精深

 

导出模板

  上面这些每次操作都添加, 很恶心. 我们可以通过 [项目] -> [导出模板] 一劳永逸. ~

1. 前戏

  找到 c_template.vcxproj 项目文件, 通过你的慧眼, 将其中所有关于 win32 相关的 xml 配置删除.

 

2. 导出模板

[项目] -> [导出模板]

C 编程环境搭建 Window 篇

添加额外补充

C 编程环境搭建 Window 篇

(图片什么的可以因自己喜好自己整)

 

演示使用

C 编程环境搭建 Window 篇

最终生成如下模板内容

C 编程环境搭建 Window 篇

不妨既兴通过这个模板演示一段代码 

#include <stdio.h>
#include <float.h>
#include <errno.h>
#include <assert.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>
#include <stdint.h>
#include <stdbool.h>

/*
 题目: 
    地上右一个 m 行 n 列的方格. 
    一个机器人从坐标(0, 0) 的格子开始移动, 它每次可以向左, 右, 上, 下移动一格, 
    但不能进入行坐标和列坐标的数位之和大于 k 的格子. 例如, 当 k 为 18 的时候,
    机器人能够进入方格 (35, 37), 因为 3 + 5 + 3 + 7 = 18. 
    但它不能进入方格 (35, 38), 因为 3 + 5 + 3 + 9 = 19.
    请问该机器人能够到达多少个格子?
 */

extern int moving_count(int m, int n, int threshold);

int main(int argc, char * argv[]) {
    int m = 20, n = 20, threshold = 10;
    int count = moving_count(m, n, threshold);
    printf("<m = %d, n = %d, threshold = %d> -> %d\n", m, n, threshold, count);
    return 0;
}

struct visite {
    int  rows;
    int  cols;
    int  threshold;
    bool visited[];
};

inline struct visite * visite_create(int rows, int cols, int threshold) {
    struct visite * v = malloc(sizeof(struct visite) + (rows * cols) * sizeof (int));
    assert(v && rows > 0 && cols > 0 && threshold > 0);
    v->rows = rows;
    v->cols = cols;
    v->threshold = threshold;
    memset(v->visited, 0, (rows * cols) * sizeof (int));
    return v;
}

inline void visite_delete(struct visite * v) {
    if (v) free(v);
}

static inline int get_digit_sum(int num) {
    int sum = 0;
    while (num > 0) {
        sum = num % 10;
        num /= 10;
    }
    return sum;
}

inline bool visite_check(struct visite * v, int row, int col) {
    if (row >= 0 && row < v->rows && col >= 0 && col < v->cols && !v->visited[row * v->cols + col]) {
        return get_digit_sum(row) + get_digit_sum(col) <= v->threshold;
    }
    return false;
}

int visite_moving(struct visite * v, int row, int col) {
    if (!visite_check(v, row, col))
        return 0;

    v->visited[row * v->cols + col] = true;
    return 1 + visite_moving(v, row, col - 1) 
             + visite_moving(v, row, col + 1) 
             + visite_moving(v, row - 1, col) 
             + visite_moving(v, row + 1, col);
}

int 
moving_count(int m, int n, int threshold) {
    if (m < 0 || n < 0 || threshold < 0)
        return 0;
    if (threshold == 0)
        return 1;

    struct visite * v = visite_create(m, n, threshold);

    int count = visite_moving(v, 0, 0);

    visite_delete(v);

    return count;
}

(有心的道友, 也可以转成栈回溯. )

 

后记 - 展望

错误是难免的, 欢迎朋友指正互相印证苦中作乐.

  立秋 - 刘翰 - 南宋
  乳鸦啼散玉屏空,一枕新凉一扇风。
  睡起秋声无觅处,满阶梧桐月明中。

 

  

上一篇:

下一篇: