什么类型的宏被考虑?

Noo*_*eer 9 c++ macros

如果我将宏定义为#define LOGIC_ONE 1并且想要LOGIC_ONE在case语句中使用,那么会LOGIC_ONE考虑哪种类型?

它被认为是int因为我为价值1定义它吗?

Ane*_*dar 19

C++宏是简单的文本替换.

在编译器启动时,您LOGIC_ONE已被1预编译器替换.它就像你1马上写的一样.(在这种情况下,这是一个int literal ...)

编辑以在评论中包含讨论:
如果您(或有权访问您的代码的其他人)更改您的内容#define LOGIC_ONE 1,#define LOGIC_ONE "1"它将改变其在您的程序中的行为并成为const char[]文字.

编辑:
由于这篇文章比我预期的更受关注,我想我为那些好奇的人添加了对C++ 14标准的引用:

2.2转换阶段 [lex.phases]
(...)
4.执行预处理指令,扩展宏调用,并执行_Pragma一元运算符表达式.(...)然后删除所有预处理指令.
(...)
7.分隔标记的空白字符不再重要.每个预处理令牌都转换为令牌.(2.6).由此产生的标记在语法和语义上进行分析并翻译为翻译单元.

如上所述,宏在阶段4中被替换,之后不再存在."语法和语义"分析发生在阶段7,其中代码被编译("翻译").

整数文字在中指定

2.13.2整数文字 [lex.icon]
(...)
整数文字是一个没有句点或指数部分的数字序列,可选的分隔单引号在确定其值时被忽略.整数文字可以具有指定其基数的前缀和指定其类型的后缀.
(......)

表5 - 整数文字的类型

   Suffix    |    Decimal literal     | Binary, octal, or hexadecimal literal  
-----------------------------------------------------------------------------
none         | int                    | int
             | long int               | unsigned int
             | long long int          | long int
             |                        | unsigned long int
             |                        | long long int
             |                        | unsigned long long int
-----------------------------------------------------------------------------
u or U       | unsigned int           | unsigned int
             | unsigned long int      | unsigned long int
             | unsigned long long int | unsigned long long int
-----------------------------------------------------------------------------
l or L       | long int               | long int
             | long long int          | unsigned long int
             |                        | long long int
             |                        | unsigned long long int
-----------------------------------------------------------------------------
Both u or U  | unsigned long int      | unsigned long int
and l or L   | unsigned long long int | unsigned long long int 
-----------------------------------------------------------------------------
ll or LL     | long long int          | long long int
                                      | unsigned long long int
-----------------------------------------------------------------------------
Both u or U  |unsigned long long int  | unsigned long long int
and ll or LL |                        |
Run Code Online (Sandbox Code Playgroud)

字符串文字在.中指定

2.13.5字符串文字 [lex.string]
(...)
1字符串文字是由双引号括起来的字符序列(如2.13.3中所定义),可选择以R,u8,u8R,u,uR为前缀,U,UR,L,rLR,如"......",R"(...)",u8"......",u8R"**(...)**",u".. .,"uR"*〜(...)*〜",U"......",UR"zzz(...)zzz",L"......"或LR"(...)" , 分别.
(...)
6在转换阶段6之后,不以encoding-prefix开头的字符串文字是普通的字符串文字,并用给定的字符初始化.
7以u8开头的字符串文字,例如u8"asdf",是一个UTF-8字符串文字.
8普通字符串文字和UTF-8字符串文字也称为窄字符串文字.窄字符串文字的类型为"n的数组const char",其中n是下面定义的字符串的大小,并且具有静态存储持续时间(3.7).

  • 你可以用任何可以对待它的方式对待它`1`-所以是的,它是一个int literal. (2认同)
  • @ user4581301不,它会变成`const char []`. (2认同)

Puf*_*fin 11

预处理器定义没有类型 - 它们基本上只是"粘贴"到它们出现的代码中.例如,您在声明中使用它;

int foo = LOGIC_ONE;
Run Code Online (Sandbox Code Playgroud)

然后它将被解释为整数.(编译器,在预处理器之后运行,只看到那个代码int foo = 1;)你甚至可以在一个诸如此类的grotty语句中使用它.

int foo##LOGIC_ONE;
Run Code Online (Sandbox Code Playgroud)

然后你将创建一个变量foo1.育!

以宏定义的另一个例子为例;

#define LOGIC_ONE hello
int LOGIC_ONE = 5;
printf("%d\n", hello);
Run Code Online (Sandbox Code Playgroud)

这是完全有效的,并声明一个名为hello的int,但表明定义没有"类型" - hello只是LOGIC_ONE在代码中遇到的地方被替换.

除非绝对必要,否则请避免使用预处理器宏.专业编码标准通常禁止或严格限制预处理器的使用.通常总是有比使用宏更好的方法.例如,考虑这些替代方案;

static const int LOGIC_ONE = 1;
enum { LOGIC_ONE = 1 };
Run Code Online (Sandbox Code Playgroud)

预处理器是学习者快速进入C语言的快捷方式.


pm1*_*100 8

LOGIC_ONE在出现的任何地方都被1替换.就编译器而言,LOGIC_ONE不存在,它只看到1.所以你的问题是'是1是一个int?'.答案是 - >它取决于你输入1的位置


PSk*_*cik 6

宏是文本替换.1是类型的constexpr int.