精华内容
下载资源
问答
  • xcode 预编译定义

    千次阅读 2015-04-03 15:19:44
    方法:利用预编译定义 方案1:在pch 中定义一个宏 VERSION_FREE 来代表 免费版 方案2:targets文件中定义一个宏 中(一个版本对应一个targets 文件:这个文件里边定义着我们应用的图标 名字 ...参数)  发布...

    方法:利用预编译 宏定义

    方案1:在pch 中定义一个宏  VERSION_FREE 来代表 免费版  

    方案2:targets文件中定义一个宏  中(一个版本对应一个targets 文件:这个文件里边定义着我们应用的图标 名字 ...参数)

        发布的时候 一个项目按照一个targets 文件来发布的 ok

        在targets 文件中定义宏:在项目的targets文件的 Build Setting 中 搜索macros(宏)ok 你会看到一个

        Apple LLVM cpmpiler x.x - Preprocessing --> Preprocessor Macros (预编译宏)ok 这个下边添加一个你要定义的宏就ok了

     

    在代码中就可以 通过这个宏来预编译 我们代码从而实现 版本的控制

     

    方案对比:

    方案2 好于 方案1 .

    原因:这样我们在app store 上边发布项目的时候就不用再在.pch 文件中修改了 (添加或者是删除我们的VERSION_FREE 这个宏)  ooo

    展开全文
  • CMake 预编译定义

    万次阅读 2018-04-04 14:17:06
    在CMakeLists.txt 中添加,如要在原生代码区分Android与IOS平台的编译,可以这么做:

    在CMakeLists.txt 中添加,如要在原生代码区分Android与IOS平台的编译,可以这么做:


    展开全文
  • gcc 编译选项宏定义

    千次阅读 2017-05-06 23:06:26
    gcc 编译时可以通过-D选项传递宏定义 #include #ifndef S #define S "ab" #endif #ifndef A #define A 10 #endif void main() { char s[]=S; char a=A; printf("a:%d\n",a); printf("s:%s",s); } gcc -o test...

    gcc 编译时可以通过-D选项传递宏定义

    #include <stdio.h>
    #ifndef S
    #define S "ab"
    #endif
    #ifndef A
    #define A 10
    #endif
    void main()
    {
    	char s[]=S;
    	char a=A;
    	printf("a:%d\n",a);
    	printf("s:%s",s);
    }

    gcc -o test.exe test.c -DS=\"abc\" -DA=100

    运行输出

    a:100
    s:abc

    展开全文
  • C语言中的预编译定义

    千次阅读 2015-01-14 16:25:16
    在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理.  C初学者可能对预...
    在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理. 
    

    C初学者可能对预处理器没什么概念, 这是情有可原的: 一般的C编译器都将预处理, 汇编, 编译, 连接过程集成到一起了. 编译预处理往往在后台运行. 在有的C编译器中, 这些过程统统由一个单独的程序来完成, 编译的不同阶段实现这些不同的功能. 可以指定相应的命令选项来执行这些功能. 有的C编译器使用分别的程序来完成这些步骤. 可单独调用这些程序来完成. 在gcc中, 进行编译预处理的程序被称为CPP, 它的可执行文件名为cpp. 

    编译预处理命令的语法与C语言的语法是完全独立的. 比如: 你可以将一个宏扩展为与C语法格格不入的内容, 但该内容与后面的语句结合在一个若能生成合法的C语句, 也是可以正确编译的.

    (一) 预处理命令简介

    预处理命令由#(hash字符)开头, 它独占一行, #之前只能是空白符. 以#开头的语句就是预处理命令, 不以#开头的语句为C中的代码行. 常用的预处理命令如下:

    #define               定义一个预处理宏
    #undef                取消宏的定义

    #include             包含文件命令
    #include_next    与#include相似, 但它有着特殊的用途

    #if                       编译预处理中的条件命令, 相当于C语法中的if语句
    #ifdef                 判断某个宏是否被定义, 若已定义, 执行随后的语句
    #ifndef              与#ifdef相反, 判断某个宏是否未被定义
    #elif                   若#if, #ifdef, #ifndef或前面的#elif条件不满足, 则执行#elif之后的语句, 相当于C语法中的else-if
    #else                 与#if, #ifdef, #ifndef对应, 若这些条件不满足, 则执行#else之后的语句, 相当于C语法中的else
    #endif               #if, #ifdef, #ifndef这些条件命令的结束标志.
    defined             与#if, #elif配合使用, 判断某个宏是否被定义

    #line                 标志该语句所在的行号
    #                       将宏参数替代为以参数值为内容的字符窜常量
    ##                    将两个相邻的标记(token)连接为一个单独的标记
    #pragma         说明编译器信息

    #warning        显示编译警告信息
    #error             显示编译错误信息

    (二) 预处理的文法

    预处理并不分析整个源代码文件, 它只是将源代码分割成一些标记(token), 识别语句中哪些是C语句, 哪些是预处理语句. 预处理器能够识别C标记, 文件名, 空白符, 文件结尾标志.

    预处理语句格式:     #command name(...) token(s)

    1, command预处理命令的名称, 它之前以#开头, #之后紧随预处理命令, 标准C允许#两边可以有空白符, 但比较老的编译器可能不允许这样. 若某行中只包含#(以及空白符), 那么在标准C中该行被理解为空白. 整个预处理语句之后只能有空白符或者注释, 不能有其它内容.
    2, name代表宏名称, 它可带参数. 参数可以是可变参数列表(C99).
    3, 语句中可以利用"\"来换行.

    e.g.
    #  define  ONE 1 /* ONE == 1 */
    等价于:  #define ONE 1

    #define err(flag, msg) if(flag) \
        printf(msg)
    等价于:  #define err(flag, msg) if(flag) printf(msg)

    (三) 预处理命令详述

    1, #define
    #define命令定义一个宏:
    #define MACRO_NAME(args) tokens(opt)
    之后出现的MACRO_NAME将被替代为所定义的标记(tokens). 宏可带参数, 而后面的标记也是可选的.

    对象宏
    不带参数的宏被称为"对象宏(objectlike macro)"

    #define经常用来定义常量, 此时的宏名称一般为大写的字符串. 这样利于修改这些常量.
    e.g.
    #define MAX 100
    int a[MAX];

    #ifndef __FILE_H__
    #define __FILE_H__
    #include "file.h"
    #endif
    #define __FILE_H__ 中的宏就不带任何参数, 也不扩展为任何标记. 这经常用于包含头文件.

    要调用该宏, 只需在代码中指定宏名称, 该宏将被替代为它被定义的内容.

    函数宏
    带参数的宏也被称为"函数宏". 利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈, 这一过程如果过于频繁会耗费掉大量的CPU运算资源. 所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率.

    函数宏的参数是固定的情况

    函数宏的定义采用这样的方式: #define name( args ) tokens
    其中的args和tokens都是可选的. 它和对象宏定义上的区别在于宏名称之后不带括号.

    注意, name之后的左括号(必须紧跟name, 之间不能有空格, 否则这就定义了一个对象宏, 它将被替换为 以(开始的字符串. 但在调用函数宏时, name与(之间可以有空格.

    e.g.
    #define mul(x,y) ((x)*(y))

    注意, 函数宏之后的参数要用括号括起来, 看看这个例子:
    e.g.
    #define mul(x,y) x*y
    "mul(1, 2+2);" 将被扩展为: 1*2 + 2
    同样, 整个标记串也应该用括号引用起来:
    e.g.
    #define mul(x,y) (x)*(y)
    sizeof mul(1,2.0) 将被扩展为 sizeof 1 * 2.0

    调用函数宏时候, 传递给它的参数可以是函数的返回值, 也可以是任何有意义的语句:
    e.g.
    mul (f(a,b), g(c,d));

    e.g.
    #define insert(stmt) stmt
    insert ( a=1; b=2;)  相当于在代码中加入 a=1; b=2 .
    insert ( a=1, b=2;)  就有问题了: 预处理器会提示出错: 函数宏的参数个数不匹配. 预处理器把","视为参数间的分隔符.  
    insert ((a=1, b=2;)) 可解决上述问题.

    在定义和调用函数宏时候, 要注意一些问题:
    1, 我们经常用{}来引用函数宏被定义的内容, 这就要注意调用这个函数宏时的";"问题.
    example_3.7:
    #define swap(x,y) { unsigned long _temp=x; x=y; y=_tmp}
    如果这样调用它: "swap(1,2);" 将被扩展为: { unsigned long _temp=1; 1=2; 2=_tmp}; 
    明显后面的;是多余的, 我们应该这样调用: swap(1,2)
    虽然这样的调用是正确的, 但它和C语法相悖, 可采用下面的方法来处理被{}括起来的内容:

    #define swap(x,y) \
        do { unsigned long _temp=x; x=y; y=_tmp} while (0)
    swap(1,2); 将被替换为:
    do { unsigned long _temp=1; 1=2; 2=_tmp} while (0);
    在Linux内核源代码中对这种do-while(0)语句有这广泛的应用.

    2, 有的函数宏是无法用do-while(0)来实现的, 所以在调用时不能带上";", 最好在调用后添加注释说明.
    eg_3.8:
    #define incr(v, low, high) \
        for ((v) = (low),; (v) <= (high); (v)++)
    只能以这样的形式被调用: incr(a, 1, 10)  /* increase a form 1 to 10 */

    函数宏中的参数包括可变参数列表的情况
    C99标准中新增了可变参数列表的内容. 不光是函数, 函数宏中也可以使用可变参数列表.

    #define name(args, ...) tokens
    #define name(...) tokens
    "..."代表可变参数列表, 如果它不是仅有的参数, 那么它只能出现在参数列表的最后. 调用这样的函数宏时, 传递给它的参数个数要不少于参数列表中参数的个数(多余的参数被丢弃). 
    通过__VA_ARGS__来替换函数宏中的可变参数列表. 注意__VA_ARGS__只能用于函数宏中参数中包含有"..."的情况.

    e.g.
    #ifdef DEBUG
    #define my_printf(...) fprintf(stderr, __VA_ARGS__)
    #else
    #define my_printf(...) printf(__VA_ARGS__)
    #endif

    tokens中的__VA_ARGS__被替换为函数宏定义中的"..."可变参数列表. 

    注意在使用#define时候的一些常见错误:
    #define MAX = 100
    #define MAX 100;
    =, ; 的使用要值得注意. 再就是调用函数宏是要注意, 不要多给出";".
    注意: 函数宏对参数类型是不敏感的, 你不必考虑将何种数据类型传递给宏. 那么, 如何构建对参数类型敏感的宏呢? 参考本章的第九部分, 关于"##"的介绍.

    关于定义宏的另外一些问题
    (1) 宏可以被多次定义, 前提是这些定义必须是相同的. 这里的"相同"要求先后定义中空白符出现的位置相同, 但具体的空白符类型或数量可不同, 比如原先的空格可替换为多个其他类型的空白符: 可为tab, 注释...
    e.g.
    #define NULL 0
    #define NULL /* null pointer */     0
    上面的重定义是相同的, 但下面的重定义不同:
    #define fun(x) x+1
    #define fun(x) x + 1 或: #define fun(y) y+1
    如果多次定义时, 再次定义的宏内容是不同的, gcc会给出"NAME redefined"警告信息.

    应该避免重新定义函数宏, 不管是在预处理命令中还是C语句中, 最好对某个对象只有单一的定义. 在gcc中, 若宏出现了重定义, gcc会给出警告.

    (2) 在gcc中, 可在命令行中指定对象宏的定义:
    e.g.
    gcc -Wall -DMAX=100 -o tmp tmp.c
    相当于在tmp.c中添加" #define MAX 100".

    那么, 如果原先tmp.c中含有MAX宏的定义, 那么再在gcc调用命令中使用-DMAX, 会出现什么情况呢?
    ---若-DMAX=1, 则正确编译.
    ---若-DMAX的值被指定为不为1的值, 那么gcc会给出MAX宏被重定义的警告, MAX的值仍为1.

    注意: 若在调用gcc的命令行中不显示地给出对象宏的值, 那么gcc赋予该宏默认值(1), 如: -DVAL == -DVAL=1

    (3) #define所定义的宏的作用域
    宏在定义之后才生效, 若宏定义被#undef取消, 则#undef之后该宏无效. 并且字符串中的宏不会被识别
    e.g.
    #define ONE 1
    sum = ONE + TWO    /* sum = 1 + TWO  */
    #define TWO 2
    sum = ONE + TWO    /* sum = 1 + 2    */  
    #undef ONE
    sum = ONE + TWO    /* sum = ONE + 2  */

    char c[] = "TWO"   /* c[] = "TWO", NOT "2"! */

    (4) 宏的替换可以是递归的, 所以可以嵌套定义宏.
    e.g.
    # define ONE NUMBER_1
    # define NUMBER_1 1
    int a = ONE  /* a = 1 */

    2, #undef
    #undef用来取消宏定义, 它与#define对立:
    #undef name
    如够被取消的宏实际上没有被#define所定义, 针对它的#undef并不会产生错误.
    当一个宏定义被取消后, 可以再度定义它. 

    3, #if, #elif, #else, #endif
    #if, #elif, #else, #endif用于条件编译:

    #if 常量表达式1
        语句...
    #elif 常量表达式2
        语句...
    #elif 常量表达式3
        语句...
    ...
    #else
        语句...
    #endif

    #if和#else分别相当于C语句中的if, else. 它们根据常量表达式的值来判别是否执行后面的语句. #elif相当于C中的else-if. 使用这些条件编译命令可以方便地实现对源代码内容的控制.
    else之后不带常量表达式, 但若包含了常量表达式, gcc只是给出警告信息.

    使用它们可以提升代码的可移植性---针对不同的平台使用执行不同的语句. 也经常用于大段代码注释.
    e.g.
    #if 0
    {
        一大段代码;
    }
    #endif

    常量表达式可以是包含宏, 算术运算, 逻辑运算等等的合法C常量表达式, 如果常量表达式为一个未定义的宏, 那么它的值被视为0.
    #if MACRO_NON_DEFINED   == #if 0
    在判断某个宏是否被定义时, 应当避免使用#if, 因为该宏的值可能就是被定义为0. 而应当使用下面介绍的#ifdef或#ifndef.

    注意: #if, #elif, #else之后的宏只能是对象宏. 如果name为名的宏未定义, 或者该宏是函数宏. 那么在gcc中使用"-Wundef"选项会显示宏未定义的警告信息.

    4, #ifdef, #ifndef, defined.
    #ifdef, #ifndef, defined用来测试某个宏是否被定义
    #ifdef name  或 #ifndef name

    它们经常用于避免头文件的重复引用:
    #ifndef __FILE_H__
    #define __FILE_H__
    #include "file.h"
    #endif

    defined(name): 若宏被定义,则返回1, 否则返回0.
    它与#if, #elif, #else结合使用来判断宏是否被定义, 乍一看好像它显得多余, 因为已经有了#ifdef和#ifndef. defined用于在一条判断语句中声明多个判别条件:

    #if defined(VAX) && defined(UNIX) && !defined(DEBUG) 

    和#if, #elif, #else不同, #indef, #ifndef, defined测试的宏可以是对象宏, 也可以是函数宏. 在gcc中使用"-Wundef"选项不会显示宏未定义的警告信息.

    5, #include , #include_next
    #include用于文件包含. 在#include 命令所在的行不能含有除注释和空白符之外的其他任何内容.
    #include "headfile"
    #include <headfile>
    #include 预处理标记
    前面两种形式大家都很熟悉, "#include 预处理标记"中, 预处理标记会被预处理器进行替换, 替换的结果必须符合前两种形式中的某一种.

    实际上, 真正被添加的头文件并不一定就是#include中所指定的文件. #include"headfile"包含的头文件当然是同一个文件, 但#include <headfile>包包含的"系统头文件"可能是另外的文件. 但这不值得被注意. 感兴趣的话可以查看宏扩展后到底引入了哪些系统头文件.

    关于#include "headfile"和#include <headfile>的区别以及如何在gcc中包含头文件的详细信息, 参考本blog的GCC笔记.

    相对于#include, 我们对#include_next不太熟悉. #include_next仅用于特殊的场合. 它被用于头文件中(#include既可用于头文件中, 又可用于.c文件中)来包含其他的头文件. 而且包含头文件的路径比较特殊: 从当前头文件所在目录之后的目录来搜索头文件.
    比如: 头文件的搜索路径一次为A,B,C,D,E. #include_next所在的当前头文件位于B目录, 那么#include_next使得预处理器从C,D,E目录来搜索#include_next所指定的头文件.

    可参考 cpp手册 进一步了解#include_next

    6, 预定义宏
    标准C中定义了一些对象宏, 这些宏的名称以"__"开头和结尾, 并且都是大写字符. 这些预定义宏可以被#undef, 也可以被重定义.

    下面列出一些标准C中常见的预定义对象宏(其中也包含gcc自己定义的一些预定义宏:
    __LINE__              当前语句所在的行号, 以10进制整数标注.
    __FILE__              当前源文件的文件名, 以字符串常量标注.
    __DATE__             程序被编译的日期, 以"Mmm dd yyyy"格式的字符串标注.
    __TIME__             程序被编译的时间, 以"hh:mm:ss"格式的字符串标注, 该时间由asctime返回.

    __STDC__             如果当前编译器符合ISO标准, 那么该宏的值为1
    __STDC_VERSION__     如果当前编译器符合C89, 那么它被定义为199409L, 如果符合C99, 那么被定义为199901L. 
                        我用gcc, 如果不指定-std=c99, 其他情况都给出__STDC_VERSION__未定义的错误信息, 咋回事呢?
    __STDC_HOSTED__         如果当前系统是"本地系统(hosted)", 那么它被定义为1. 本地系统表示当前系统拥有完整的标准C库.


    gcc定义的预定义宏:
    __OPTMIZE__             如果编译过程中使用了优化, 那么该宏被定义为1.
    __OPTMIZE_SIZE__     同上, 但仅在优化是针对代码大小而非速度时才被定义为1.
    __VERSION__             显示所用gcc的版本号.
    可参考"GCC the complete reference".
    要想看到gcc所定义的所有预定义宏, 可以运行: $ cpp -dM /dev/null

    7, #line
    #line用来修改__LINE__和__FILE__. 
    e.g.
       printf("line: %d, file: %s\n", __LINE__, __FILE__);
    #line 100 "haha"
      printf("line: %d, file: %s\n", __LINE__, __FILE__);
      printf("line: %d, file: %s\n", __LINE__, __FILE__);

    显示:
    line: 34, file: 1.c
    line: 100, file: haha
    line: 101, file: haha  

    8, #pragma, _Pragma
    #pragma用编译器用来添加新的预处理功能或者显示一些编译信息. #pragma的格式是各编译器特定的, gcc的如下:
    #pragma GCC name token(s)

    #pragma之后有两个部分: GCC和特定的pragma name. 下面分别介绍gcc中常用的.

    (1) #pragma GCC dependency
    dependency测试当前文件(既该语句所在的程序代码)与指定文件(既#pragma语句最后列出的文件)的时间戳. 如果指定文件比当前文件新, 则给出警告信息. 
    e.g.
    在demo.c中给出这样一句:
    #pragma GCC dependency "temp-file"
    然后在demo.c所在的目录新建一个更新的文件: $  touch temp-file , 编译: $  gcc demo.c  会给出这样的警告信息:   warning: current file is older than temp-file
    如果当前文件比指定的文件新, 则不给出任何警告信息.

    还可以在在#pragma中给添加自定义的警告信息.
    e.g.
    #pragma GCC dependency "temp-file" "demo.c needs to be updated!"
    1.c:27:38: warning: extra tokens at end of #pragma directive

    1.c:27:38: warning: current file is older than temp-file
    注意: 后面新增的警告信息要用""引用起来, 否则gcc将给出警告信息.

    (2) #pragma GCC poison token(s)
    若源代码中出现了#pragma中给出的token(s), 则编译时显示警告信息. 它一般用于在调用你不想使用的函数时候给出 出错信息 .
    e.g.
    #pragma GCC poison scanf
    scanf("%d", &a); 
    warning: extra tokens at end of #pragma directive
    error: attempt to use poisoned "scanf"
    注意, 如果调用了poison中给出的标记, 那么编译器会给出的是出错信息. 关于第一条警告, 我还不知道怎么避免, 用""将token(s)引用起来也不行.

    (3) #pragma GCC system_header
    从#pragma GCC system_header直到文件结束之间的代码会被编译器视为系统头文件之中的代码. 系统头文件中的代码往往不能完全遵循C标准, 所以头文件之中的警告信息往往不显示. (除非用 #warning显式指明). 
    (这条#pragma语句还没发现用什么大的用处 )

    由于#pragma不能用于宏扩展, 所以gcc还提供了 _Pragma :
    e.g.
    #define PRAGMA_DEP #pragma GCC dependency "temp-file"
    由于预处理之进行一次宏扩展, 采用上面的方法会在编译时引发错误, 要将#pragma语句定义成一个宏扩展, 应该使用下面的_Pragma语句:
    #define PRAGMA_DEP _Pragma("GCC dependency \"temp-file\"")
    注意, ()中包含的""引用之前引该加上\转义字符.

    9, #, ##
    #和##用于对字符串的预处理操作, 所以他们也经常用于printf, puts之类的字符串显示函数中.
    # 用于在宏扩展之后将tokens转换为以tokens为内容的字符串常量.
    e.g.
    #define TEST(a,b) printf( #a "<" #b "=%d\n", (a)<(b));
    注意: #只针对紧随其后的token有效!
    ## 用于将它前后的两个token组合在一起转换成以这两个token为内容的字符串常量. 注意##前后必须要有token.
    e.g.
    #define TYPE(type, n) type n

    之后调用:  
    TYPE(int, a) = 1;
    TYPE(long, b) = 1999;
    将被替换为:
    int a = 1;
    long b = 1999;

    (10) #warning, #error
    #warning, #error分别用于在编译时显示警告和错误信息, 格式如下:
    #warning tokens
    #error tokens
    e.g.
    #warning "some warning"
    注意, #error和#warning后的token要用""引用起来!

    (在gcc中, 如果给出了warning, 编译继续进行, 但若给出了error, 则编译停止. 若在命令行中指定了 -Werror, 即使只有警告信息, 也不编译.)

    (原文链接:http://www.uml.org.cn/c++/200902104.asp

    展开全文
  • 定义 无声明 调用函数 可以编译,可以链接 有定义 有声明 调用函数 可编译,可链接 无定义 有声明 调用函数 可编译,无法链接 无定义 无声明 无法编译 二 静态断言 assert 宏定义: 1 用法和示例 在编写代码时,...
  • C语言的编译预处理功能主要包括:文件包括(#include)、宏定义(#define)、条件编译 编译预处理是C语言编译程序的组成部分,用于解释处理C语言源程序种的各种预处理指令,形式上都以#开头不属于C语言种真正的语句,...
  • VB宏定义(条件编译方法)

    千次阅读 2019-04-21 17:55:12
    VB条件编译——宏定义 前言 ❤我们在开发软件时,如果该软件是应用在多产品或者多平台上面,不同的地方使用不同的代码,这时候条件编译就会变得很方便。 内容 ❤条件编译语句:#If。。。Then。。。 #Else。。。#Else...
  • Makefile中用宏定义条件编译

    千次阅读 2017-11-21 15:53:45
    Makefile中用宏定义条件编译,这样可以不修改代码的情况下编译出不同的版本。make –f=./makefile1 指定使用 makefile1 编译 make clean 清除编译的.o 和二进制文件代码:a.c#include <stdio.h> #include <...
  • 头文件中的数据结构定义引用一次就行,但函数可以使用多次,所以会出现数据结构重复定义多次的错误 解决方法: 可以把数据结构和函数声明分开定义 一般情况下数据结构定义时也要加上#ifndef和#endif,防止因为多...
  • 语言的定义——编译原理

    千次阅读 2020-08-17 09:18:38
    什么是编译原理中的推导和规约,句型和句子,语言的形式化定义
  • 通过命令行cl.exe编译Windows程序--跟踪宏定义
  • 编译原理 —— 文法的定义

    千次阅读 2019-01-26 17:36:42
    文法的形式化定义 VTV_TVT​:终结符是文法所定义的语言的基本符号,有时也称为token。(对应词义分析) VNV_NVN​:非终结符是用来表示语法成分的符号,有时也称为&amp;amp;amp;amp;quot;语法变量&amp;amp...
  • 编译原理 —— 语言的定义

    千次阅读 2019-01-26 17:44:37
    语言的形式化定义 推导 用产生式的右部替换产生式的左部(生成语言) 规约 用产生式的左部替换产生式的右式(识别语言) 判定 有了文法(语言规范),如何判定某一词串是否是满足文法的句子? 从生成语言的...
  • makefile中定义宏进行编译

    千次阅读 2013-06-05 16:39:47
    最近编译了一个h.264的开源软件,发现其中一个错误是没有定义变量,详细查看了下该文件时选择编译的,即采用了#ifdef USE_DISPLAY则编译该段代码,如果没有则不进行编译。此处,我们在源文件中没有进行定义,而是在...
  • integral_constant定义编译期常量

    千次阅读 2017-07-13 12:28:53
    integral_constant就可方便地定义编译期常量,而无需再通过enum和static const变量方式,这也为定义编译期常量提供另一种方法。 integral_constant类 是所有traits类的基类,分别提供了以下功能:
  • C语言详解(6)宏定义和条件编译

    万次阅读 多人点赞 2017-12-02 21:54:41
    定义和条件编译    关于C语言详解系列blog的目录:http://blog.csdn.net/snake_lp/article/details/78630717   一、概述 宏定义是C语言的预处理功能。宏定义就是简单的替换,不作为计算,不也作为表达式。...
  • 预处理-宏定义-条件编译

    千次阅读 2018-08-09 11:53:34
    1、预处理之宏定义 可以用#define命令将一个指定的标识符(即宏名)来代表一个字符串; 宏定义语法:#define 宏名 字符串 使用原则: 1、“原样替换”; 2、不能代替函数; 3、定义时后缀不要加分号。 带参数...
  • 在Makefile文件中定义编译定义 PLATFORM_TYPE 方法如下: CFLAGS:= -DPLATFORM_TYPE 而在qt的 .pro文件中添加方法如下: DEFINES += PLATFORM_TYPE 结束????
  • (1)__OPTIMIZE__ :用于release和debug的判断,当选择了__OPTIMIZE__ 时...意思是 如果标识符****已被#define命令定义过,则对代码1进行编译,否则对代码2进行编译。 同时也有#ifndef,则与#ifdef刚好相反。
  • C++编译提示宏重定义了,怎么办?

    千次阅读 2019-11-14 15:43:28
    C++编译提示宏重定义了,怎么办? 如果需要重新定义,要这样,先取消定义,再重新定义: #ifdefNUMPENS//firecat宏重定义 #undefNUMPENS #endif #ifndefNUMPENS #defineNUMPENS256 #endif #ifdefPI//宏重定义...
  • 定义与条件编译的用处

    千次阅读 2016-11-25 22:39:32
    #define 定义宏  #undef 取消已定义的宏  宏定义常量与命令可以避免幻数 在宏定义命名时候应该尽量清楚表明其用途。 函数型宏定义的有点:尽管其和真正的函数相比有很多缺点,但只要小心使用还是会显著提高...
  • gcc编译时指定宏定义

    千次阅读 2011-06-09 15:57:00
    编译时:gcc -DMAX=32 -o a a.c 相当于在文件a.c中定义:#define MAX 32
  • 从源代码生成可执行文件的各个阶段为: C源程序(.c)->编译预处理(.i)->编译(.s)->优化程序->汇编程序(.o)->链接程序->可执行文件(.exe) ...预处理过程在编译时处理包含其他源文件、定义宏、根据条
  • Unity3D 多平台_预编译相关宏定义

    万次阅读 2013-03-22 15:48:55
    原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D... 多平台_预编译相关宏定义编译 原文地址:http://docs.unity3d.com/Documentation/Manual/PlatformDependentCompilation.html 平台定义
  • Makefile中用宏定义进行条件编译

    千次阅读 2016-05-06 23:00:52
    在源代码里面如果这样是定义的: #ifdef MACRONAME //可选代码 #endif 那在makefile里面 ...这样就定义了预处理宏,编译的时候可选代码就会被编译进去了。 对于GCC编译器,有如下选项:  -D macro=s
  • C中在多个文件编译时,如果 fun.c 使用到了 fun.h 的宏定义、类型定义等,还需要在 fun.c 中 #include "fun.c"。想请问下这句话有没错误,不应该是需要在fun.c中#include "fun.h"吗 ...
  • 1、编译Android系统之前都要执行一下source build/envsetup.sh 这个命令,这个命令是用来加载了编译时使用到的函数,如:help,lunch,m,mm,mmm等。比如我们常用的单独编译某个模块的代码命令mmm,要想用这个命令...
  •  最近在编译TVOS2.1代码时,编译9分钟后提示一个枚举变量没有定义:  查看DTVAL.h文件,此文件有声明一个函数,函数第二个参数有使用到一个枚举变量,提示没有定义。然后查看原因,DTVAL.h文件有包含DTVALDATA....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,535,066
精华内容 614,026
关键字:

编译的定义