标签: c-preprocessor

#if中使用的未定义常量的值是多少?

为了评估#if条件,我的预处理器似乎假设未定义的常量为0 .

可以依赖它,还是未定义的常量给出未定义的行为?

c++ c-preprocessor

61
推荐指数
2
解决办法
7521
查看次数

为什么C预处理器将枚举值视为相等?

为什么std::cout以下代码中的行仍然运行A并且B不同?

#include <iostream>

enum T { A = 1, B = 2 };
// #define A 1
// #define B 2

int main() {
#if (A == B)
    std::cout << A << B;
#endif
}
Run Code Online (Sandbox Code Playgroud)

如果我使用#define(如注释掉),我没有得到任何输出,如我所料.

问题的原因:

我希望有一个模式选择器用于某些测试代码,我可以通过在顶部注释/取消注释行来轻松更改模式:

enum T { MODE_RGB = 1, MODE_GREY = 2, MODE_CMYK = 3 };
// #define MODE MODE_RGB
#define MODE MODE_GREY
// #define MODE MODE_CMYK

int main() {
#if (MODE == MODE_RGB)
    // do RGB …
Run Code Online (Sandbox Code Playgroud)

c++ c-preprocessor

61
推荐指数
6
解决办法
8272
查看次数

将预处理程序标记转换为字符串

我正在寻找一种方法将预处理器令牌转换为字符串.

具体来说,我在某处得到了:

#define MAX_LEN 16
Run Code Online (Sandbox Code Playgroud)

我想用它来防止缓冲区溢出:

char val[MAX_LEN+1]; // room for \0
sscanf(buf, "%"MAX_LEN"s", val);
Run Code Online (Sandbox Code Playgroud)

我愿意通过其他方式来完成同样的事情,但仅限标准库.

c stringification c-preprocessor

60
推荐指数
3
解决办法
7万
查看次数

以井号开头的行和gcc预处理器输出中的'#1"ac"'之类的数字是什么意思?

我使用打印出C预处理器的输出

gcc -E a.c
Run Code Online (Sandbox Code Playgroud)

输出包含许多行

# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.c"
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 1 3
# 19 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 3
# 1 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 1 3
# 31 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3

# 32 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/_mingw.h" 3
# 20 "c:\\mingw\\bin\\../lib/gcc/mingw32/4.5.0/../../../../include/stdio.h" 2 3
Run Code Online (Sandbox Code Playgroud)

我从未在C中看到过这种语法.有人可以解释这是做什么的吗?

c gcc c-preprocessor

60
推荐指数
2
解决办法
4万
查看次数

C++预处理器:避免代码重复成员变量列表

我有一个多个类,每个类都有不同的成员变量,这些变量在构造函数中被简单地初始化.这是一个例子:

struct Person
{
    Person(const char *name, int age)
        :
        name(name),
        age(age)
    {
    }
private:
    const char *name;
    int age;
};
Run Code Online (Sandbox Code Playgroud)

每个都有一个相关的print<>()功能.

template <>
void print<Person>(const Person &person)
{
    std::cout << "name=" << name << "\n";
    std::cout << "age=" << age << "\n";
}
Run Code Online (Sandbox Code Playgroud)

由于参数列表在四个位置复制,因此该代码容易出错.如何重写代码以避免重复?我想使用预处理器和/或模板.

例如,我可以使用X-args预处理器技术 - 类似这样的东西吗?

#define ARGUMENTS \
    ARG(const char *, name) \
    ARG(int, age)

struct Person
{
    Person(LIST_TYPE_NAME_COMMA(ARGUMENTS))
       :
       LIST_NAME_INIT(ARGUMENTS)
    {
    }
private:
    LIST_TYPE_NAME_SEMICOLON(ARGUMENTS)
};

template <>
void print<Person>(const Person &person)
{
   LIST_COUT_LINE(ARGUMENTS)
} …
Run Code Online (Sandbox Code Playgroud)

c++ templates arguments c-preprocessor

60
推荐指数
2
解决办法
3万
查看次数

sizeof(enum)== sizeof(int),总是吗?

sizeof(enum)== sizeof(int),总是吗?

  • 还是编译器依赖?
  • 这是错误的,因为编译器针对字长度(内存对齐)进行了优化,即y int是特定编译器上的字大小?如果我使用枚举,这是否意味着没有处理惩罚,因为它们将是字对齐的?
  • 如果我将所有返回代码放在枚举中是不是更好,因为我显然不担心它获得的值,只检查返回类型时的名称.如果是这种情况,#DEFINE会更好,因为它可以节省内存.

通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端完成某些处理,那么您更喜欢枚举/ #define/const ints.

编辑 - 只是检查网络,因为编译器不象征性地链接宏,人们如何调试,比较整数值与头文件?

来自答案 - 我在下面添加这一行,因为我需要澄清 -

"因此它是实现定义的,而sizeof(枚举)可能等于sizeof(char),即1."

  • 这是否意味着编译器检查枚举中的值范围,然后分配内存.我不这么认为,当然我不知道.有人可以解释一下"可能是什么".

c enums const c-preprocessor

58
推荐指数
4
解决办法
6万
查看次数

58
推荐指数
2
解决办法
2万
查看次数

预处理器检查是否未定义多个定义

我在用户可编辑的标题中选择了#define,因此我随后希望检查定义是否存在以防用户完全删除它们,例如

#if defined MANUF && defined SERIAL && defined MODEL
    // All defined OK so do nothing
#else
    #error "User is stoopid!"
#endif
Run Code Online (Sandbox Code Playgroud)

这完全没问题,我想知道是否有更好的方法来检查是否有多个定义没有到位...即:

#ifn defined MANUF || defined SERIAL ||.... // note the n in #ifn
Run Code Online (Sandbox Code Playgroud)

或者可能

#if !defined MANUF || !defined SERIAL ||....
Run Code Online (Sandbox Code Playgroud)

删除空#if部分的需要.

c c-preprocessor

58
推荐指数
2
解决办法
9万
查看次数

为什么断言宏而不是函数?

我的讲师在课堂上问过我,我想知道为什么它是一个宏而不是一个函数?

c assert c-preprocessor

58
推荐指数
4
解决办法
5595
查看次数

C++中的DEBUG宏

我刚刚在C中遇到了一个我非常喜欢的DEBUG宏

#ifdef DEBUG_BUILD
#  define DEBUG(x) fprintf(stderr, x)
#else
#  define DEBUG(x) do {} while (0)
#endif
Run Code Online (Sandbox Code Playgroud)

我猜一个C++模拟会是: -

#ifdef DEBUG_BUILD
#  define DEBUG(x) cerr << x
#else
#  define DEBUG(x) do {} while (0)
#endif
Run Code Online (Sandbox Code Playgroud)
  1. 第二个代码片段是否类似于C中的代码片段?
  2. 你有任何喜欢的C++调试宏吗?

编辑:通过"调试宏"我的意思是"在调试模式下运行程序时可能派上用场的宏".

c c++ debugging c-preprocessor

56
推荐指数
6
解决办法
7万
查看次数

标签 统计

c-preprocessor ×10

c ×6

c++ ×4

arguments ×1

assert ×1

const ×1

debugging ×1

enums ×1

gcc ×1

stringification ×1

templates ×1