标签: c-preprocessor

神秘案例常量不止一次定义错误

我正在使用C语言商业RTOS的套接字库来开发嵌入式项目.出于保密原因,我对某些周围的细节会非常模糊,但只知道有一个完整的产品和RTOS堆栈.

在我正在研究的部分中,我有一个相当大但很简单的switch语句,它检查一个宏值并设置另一个宏值.案例值是RTOS标头中的套接字选项标志.当我用这个switch语句编译文件时,我得到一个错误,说"不止一次定义了case case",指的是其中五个案例.

以下是一些让这个神秘的细节:

  1. 包裹所有标题#ifndef HEADER以避免多个包含.
  2. 宏值来自多个不同的标题,但是案例是否产生此错误与原始标题之间没有明显的相关性.
  3. 如果我注释掉单个定义或者没有明确地包含该标题,我会得到"未定义的标识符",因此它明确地与该文件和定义相关联.
  4. 如果我在Eclipse中执行"C/C++"搜索宏,它会列出定义的两个实例,但它们都引用同一文件中的相同位置.

我是由一位资深开发人员在这里经营的,他和我一样神秘.有没有人知道可能导致这种情况的C解释的怪癖,或者任何地雷可能被忽视了?

谢谢!

c embedded c-preprocessor

-1
推荐指数
1
解决办法
155
查看次数

如何避免#define语法的变量重新声明?

当我们在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)

这是不可能的.有没有办法实现这个目标?

c++ c-preprocessor

-1
推荐指数
1
解决办法
47
查看次数

C中的预处理程序命令是否计为令牌?

我正在阅读关于令牌和计算程序中令牌数量的内容.

以前我在某处读过预处理器命令不算作令牌.但是当我在Geeksforgeeks上阅读有关令牌时,它会在"特殊符号"部分中给出:

预处理器(#):预处理器是一个宏处理器,编译器会在实际编译之前自动转换程序.

所以我很困惑,在一个程序中,如果我们写#define它将是一个令牌吗?

例如:

#include<stdio.h> 
#define max 100 
int main() 
{ 
    printf("max is %d", max); 
    return 0; 
} 
Run Code Online (Sandbox Code Playgroud)

这个例子中有多少个令牌.

c token c-preprocessor

-1
推荐指数
1
解决办法
185
查看次数

将预处理器指令作为语句的一部分

我们转到了新的编译环境,突然间我开始在此语句上看到此错误“期望的表达式”:

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标准有关吗?

c++ c-preprocessor constexpr c++11

-1
推荐指数
1
解决办法
59
查看次数

将cout <<"string"替换为cout <<"string"<< endl in cpp

我想用cout一个程序替换每个程序中的每个程序但是连接起来endl.我正在尝试使用宏,但无法弄清楚如何做到这一点.请帮忙!

有没有办法在程序中编写完整的行,只是简单地<< endl用它来结束?注意,如果endl已经由程序员编写,endl则不会连接.

如果有其他更好的方法,请建议.

c++ c-preprocessor

-2
推荐指数
1
解决办法
994
查看次数

#define与C++中的const

我有一个理论问题;).在这本书中,我一直在学习C++(虽然它很棒,只有我的母语,所以标题不会指定任何东西)作者在#defineconst变量之间进行了比较.他是第二种方法,因为它更适合调试,但他没有谈到的一件事就是内存管理.假设我们有很多常量我们希望定义.当然它可能需要很多内存.说实话,我还在学习,我从来没有需要这么多常数,但是当我学会了你可以选择之间short,int而且long,我开始想,也许那些小位在大程序中有所作为.所以我的问题是:你怎么看?

c++ const c-preprocessor

-2
推荐指数
1
解决办法
385
查看次数

为什么我的代码输出错误?

我正在运行以下代码:

#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.为什么这样?我无法弄清楚为什么会发生这种情况.请帮忙.

c c-preprocessor

-2
推荐指数
1
解决办法
90
查看次数

如何在向量<int>中插入预处理器值?

#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一样的处理.

c++ stl c-preprocessor

-2
推荐指数
1
解决办法
301
查看次数

(C/C++)如何创建一个接受增量运算符的宏

为了使我的问题精确,我想创建一个接受变量++并将其与另一个变量粘贴的宏.在代码中:

#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"不会提供有效的预处理令牌

有可能做我正在尝试的事情吗?

提前谢谢你的答案

c c++ macros c-preprocessor

-2
推荐指数
1
解决办法
375
查看次数

宏 - 表达式不可分配

编译时出现此错误:

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 macros c-preprocessor

-2
推荐指数
2
解决办法
575
查看次数

标签 统计

c-preprocessor ×10

c++ ×6

c ×5

macros ×2

c++11 ×1

const ×1

constexpr ×1

embedded ×1

stl ×1

token ×1