我正在使用C语言商业RTOS的套接字库来开发嵌入式项目.出于保密原因,我对某些周围的细节会非常模糊,但只知道有一个完整的产品和RTOS堆栈.
在我正在研究的部分中,我有一个相当大但很简单的switch语句,它检查一个宏值并设置另一个宏值.案例值是RTOS标头中的套接字选项标志.当我用这个switch语句编译文件时,我得到一个错误,说"不止一次定义了case case",指的是其中五个案例.
以下是一些让这个神秘的细节:
#ifndef HEADER以避免多个包含.我是由一位资深开发人员在这里经营的,他和我一样神秘.有没有人知道可能导致这种情况的C解释的怪癖,或者任何地雷可能被忽视了?
谢谢!
当我们在c ++中传递类类型的参数时,我们别无选择,只能使用#define.但这会使代码变得混乱.
#include <vector>
#define APPEND(className) \
base = new className(); \
baseVector.push_back(base); \
class Base{};
class Child1 : public Base{};
class Child2 : public Base{};
// ...
class Child10 : public Base{};
std::vector<Base*> baseVector;
int main(void){
Base* base; // I want to remove this
APPEND(Child1);
APPEND(Child2);
// ...
APPEND(Child10);
}
Run Code Online (Sandbox Code Playgroud)
如果我将Base*base放在#define语法中,则会发生重新声明错误.但是,如果我愿意的话,它看起来很尴尬.
#define APPEND(className) \
#ifndef DECL \
Base* base; \
#define DECL \
#endif \
base = new className(); \
baseVector.push_back(base); \
Run Code Online (Sandbox Code Playgroud)
这是不可能的.有没有办法实现这个目标?
我正在阅读关于令牌和计算程序中令牌数量的内容.
以前我在某处读过预处理器命令不算作令牌.但是当我在Geeksforgeeks上阅读有关令牌时,它会在"特殊符号"部分中给出:
预处理器(#):预处理器是一个宏处理器,编译器会在实际编译之前自动转换程序.
所以我很困惑,在一个程序中,如果我们写#define它将是一个令牌吗?
例如:
#include<stdio.h>
#define max 100
int main()
{
printf("max is %d", max);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个例子中有多少个令牌.
我们转到了新的编译环境,突然间我开始在此语句上看到此错误“期望的表达式”:
enum {
PROJX,
PROJY,
PROJW
};
constexpr int PLATFORM =
#if defined(X)
PROJX
#elif defined(Y)
PROJY
#elif defined(W)
PROJW
#endif
;
Run Code Online (Sandbox Code Playgroud)
错误指向最后一个分号。
这与特定的c ++ 11/14/17标准有关吗?
我想用cout一个程序替换每个程序中的每个程序但是连接起来endl.我正在尝试使用宏,但无法弄清楚如何做到这一点.请帮忙!
有没有办法在程序中编写完整的行,只是简单地<< endl用它来结束?注意,如果endl已经由程序员编写,endl则不会连接.
如果有其他更好的方法,请建议.
我有一个理论问题;).在这本书中,我一直在学习C++(虽然它很棒,只有我的母语,所以标题不会指定任何东西)作者在#define和const变量之间进行了比较.他是第二种方法,因为它更适合调试,但他没有谈到的一件事就是内存管理.假设我们有很多常量我们希望定义.当然它可能需要很多内存.说实话,我还在学习,我从来没有需要这么多常数,但是当我学会了你可以选择之间short,int而且long,我开始想,也许那些小位在大程序中有所作为.所以我的问题是:你怎么看?
我正在运行以下代码:
#include<stdio.h>
#define x 5+2
int main() {
int p;
p = x*x*x;
printf("%d",p);
}
Run Code Online (Sandbox Code Playgroud)
我期待343作为输出,但答案是27.为什么这样?我无法弄清楚为什么会发生这种情况.请帮忙.
#define HEADER = 5
int _tmain(int argc, _TCHAR* argv[])
{
vector<int> v;
v.push_back(HEADER);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这段代码给我一个syntex错误?
至于我的预处理器得到像int一样的处理.
为了使我的问题精确,我想创建一个接受变量++并将其与另一个变量粘贴的宏.在代码中:
#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)