在下面的代码中,输出值不是宏定义的,是因为这些值必须在预处理器阶段之前可用吗?
#define INT_MAX 100
#include <iostream>
using namespace std;
int main()
{
int x = INT_MAX;
x++;
cout<<x<<INT_MAX;
}
Run Code Online (Sandbox Code Playgroud)
结果是-2147483648
为了使我的问题精确,我想创建一个接受变量++并将其与另一个变量粘贴的宏.在代码中:
#define MYMACRO(A, OP) /* .... */
Run Code Online (Sandbox Code Playgroud)
然后,如果我写在源文件中
MYMACRO(this->var, ++)
Run Code Online (Sandbox Code Playgroud)
预处理器应粘贴代码
this->var++;
Run Code Online (Sandbox Code Playgroud)
当我尝试将宏定义为A ## OP时,它提供以下错误:
粘贴"++"和"var"不会提供有效的预处理令牌
有可能做我正在尝试的事情吗?
提前谢谢你的答案
编译时出现此错误:
macro.c:11:2: error: expression is not assignable
ProdottoAumentato(10, 20);
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会这样说,我找不到任何错误.这是代码:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#define ProdottoAumentato(X, Y) X++; X * Y;
int main(void) {
ProdottoAumentato(10, 20);
printf("\nEnd\n");
return(0);
}
Run Code Online (Sandbox Code Playgroud) 介绍(如果你不想要,请不要阅读,这只是背景)
我正在为 C++ 创建一个 API,以便它具有类似 python 的功能,而不会失去它的本质。我已经成功开发了一个自动通用异常处理系统(我在这里问如何做到这一点,@MacZamborg 告诉我它是如何工作的,所以我开始从头开始拆除所有东西)。就像我说的,我设法重载了很多东西,以便自动抛出相应的异常(它继承自 std::exception)。我唯一遇到的问题是 ZERO_DIVISION 异常,因为您似乎不能只为整数重载运算符,即参数之一必须是对象。所以我创建了 Object Num,它使用联合来存储任何可用的数字数据)-> 这意味着,我必须重载每个运算符 11 次,所以我想避免需要重载X=运算符。(也在这里问了一些关于它的事情)。
题
有没有办法在任何 IDE 中制作智能宏?什么是智能宏,你可能会问,好吧,让我们假设有一种叫做 C+++ 的新语言,它实现了智能宏 > 智能宏应该像这样 >
#define "regEx" "Literal replacement"
Run Code Online (Sandbox Code Playgroud)
在实践中:
#define '([^\d ]?\w+\s*)\+=' '$groups[0] = $groups[0] + '
Run Code Online (Sandbox Code Playgroud)
随着([^ \ d] \ w + \ S *)作为组数组中的唯一元素(语法来自python的正则表达式,我可能有一些错误,但这个想法是一样的)。regEx 的那部分将匹配任何有效的变量名(包括保留关键字 [不可取,但我们用\+=去掉它们]),也就是说,任何以空格或数字开头的单词,包含任何字符,并以空格(0 或更多)结尾。之后,它查找+=运算符,如果匹配,则将整个匹配替换为'$groups[0] = $groups[0] + ',即在唯一组中找到的任何内容(由括号表示) ), 'space' '=' 'space' '又发现了什么' 'space' '+' …
我在编译过程中传递了一个 macto:
% gcc -DIDENT="abcd" app.c
在编译宏期间检查的正确方法是什么?例如下面的工作,但抛出警告:
#ifdef IDENT == "abcd"
printf("abcd\n");
#endif
Run Code Online (Sandbox Code Playgroud)
警告:#ifdef 指令末尾的额外标记。
#define WITHBRACKETS (1)和之间有什么区别#define WITHBRACKETS 1?
我在两个具有相同名称的地方定义了宏(我知道这可能导致重新定义警告,这是一件坏事),但它们的定义不同.
所以当我编译代码库时,编译器为什么说,#define WITHBRACKETS (1)是不兼容的重新定义#define WITHBRACKETS 1?
#define int double
#define double int
int a = 5.5;
double f = 5.5;
cout << a << " " << f << endl;
Run Code Online (Sandbox Code Playgroud)
以下代码片段实际输出5 5.5,意味着int实际上意味着int,而double实际上意味着double.
我想知道这有什么意义?我可以相信int和double意味着int,如果定义是一个接一个地执行,或者其中两个改变它们的含义(如果它们都同时执行),但我找不到对这种行为的正确解释.
为什么会这样?
我在代码审查中注意到以下代码:
for (int i = 0; i < 50; ++i) {
switch(i) {
case 0:
return f1();
case 1:
return f2();
...
case 49:
return f50();
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何优雅的方式,例如使用宏来简化此代码(将其减少到几行):
谢谢.
我试图定义ll为long long. 但是,这没有编译并引发错误。
我在 Windows 机器上使用 VS Code。我也在使用 gcc 8.2.0 版。
这是代码 -
#include <bits/stdc++.h>
using namespace std;
#define ll long long int;
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
ll t;
cin >> t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在编译这个时,我收到了这个错误 -
test.cpp: In function 'int main()':
test.cpp:5:22: error: declaration does not declare anything [-fpermissive]
#define ll long long int;
^~~
test.cpp:12:5: note: in expansion of macro 'll'
ll t;
^~
test.cpp:12:8: error: 't' was not declared in this scope …Run Code Online (Sandbox Code Playgroud) 在(x) ((x) - 1)宏或 typedef 的帮助下,“表达式”能否成为有效的 C 表达式?