相关疑难解决方法(0)

使用C预处理器将int连接到字符串

我试图找出如何使用C预处理器将#define'd int 连接到#define'字符串.我的编译器是CentOS 5上的GCC 4.1.该解决方案也适用于MinGW.

我想在字符串上附加一个版本号,但我能让它工作的唯一方法是将版本号的副本定义为字符串.

我能找到的最接近的东西是引用宏参数的方法,但它不适用于#defines

这不起作用.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
Run Code Online (Sandbox Code Playgroud)

它不没有工作,#小号或者是因为值为数字,它会扩大到"/home/user/.myapp" 2 6,这是无效的Ç.

这确实有效,但我不喜欢有版本定义的副本,因为我确实需要它们作为数字.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING
Run Code Online (Sandbox Code Playgroud)

c stringification c-preprocessor

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

如何在gcc命令行中定义字符串文字?

在gcc命令行中,我想定义一个字符串-Dname=Mary,然后在我要printf("%s", name);打印的源代码中Mary.
我怎么能这样做?

c c++ macros command-line gcc

66
推荐指数
4
解决办法
5万
查看次数

如何从C宏的值创建一个char字符串?

例如,如何避免两次写'func_name'?

#ifndef TEST_FUN
#  define TEST_FUN func_name
#  define TEST_FUN_NAME "func_name"
#endif
Run Code Online (Sandbox Code Playgroud)

我想遵循单点真相规则.

C预处理器的版本:

$ cpp --version
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
Run Code Online (Sandbox Code Playgroud)

c dry c-preprocessor

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

C宏来创建字符串

替代标题(以帮助搜索)

  • 将预处理程序标记转换为字符串
  • 如何从C宏的值创建一个char字符串?

原始问题

我想在编译时使用C #define来构建文字字符串.

该字符串是为调试,发布等而更改的域.

我想要一些这样的事情:

#ifdef __TESTING
    #define IV_DOMAIN domain.org            //in house testing
#elif __LIVE_TESTING
    #define IV_DOMAIN test.domain.com       //live testing servers
#else
    #define IV_DOMAIN domain.com            //production
#endif

// Sub-Domain
#define IV_SECURE "secure.IV_DOMAIN"             //secure.domain.org etc
#define IV_MOBILE "m.IV_DOMAIN"
Run Code Online (Sandbox Code Playgroud)

但预处理器不评估""内的任何内容

  1. 有没有解决的办法?
  2. 这甚至是个好主意吗?

c macros stringification c-preprocessor

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

我可以使用C-preprocssor将整数转换为字符串吗?

必须有办法做到这一点......

我有一个头文件,version.h有一行...

#define VERSION 9
Run Code Online (Sandbox Code Playgroud)

一些文件使用VERSION的定义值作为整数.没关系.

在不改变定义VERSION的方式的情况下,我需要构建一个包含该值的初始化"what"字符串,所以我需要这样的东西......

char *whatversion = "@(#)VERSION: " VERSION;
Run Code Online (Sandbox Code Playgroud)

显然这不会编译,所以不知怎的,我需要得到一个VERSION的预处理值的字符串,基本上给这个...

char *whatversion = "@(#)VERSION: " "9";
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?这可能吗?

c

5
推荐指数
2
解决办法
221
查看次数

寻找将十进制值宏转换为十六进制表示的宏

在我的一个项目中,我将当前版本定义为十进制值,看起来像这样:

#define MINOR_VERSION 13
Run Code Online (Sandbox Code Playgroud)

为了能够在被要求时输出版本,我需要将十六进制表示形式转换为字符串.目前我正在使用sprintf(),它基本上是这样的:

char buffer[3];
sprintf(buffer, "%2x", MINOR_VERSION);
// output buffer
Run Code Online (Sandbox Code Playgroud)

这有一些缺点,其中一个缺点是代码大小增加,因为需要包含sprintf().此外,值在运行时计算,这无论如何都是浪费的努力.这两个问题对我来说都很重要,因为我在这里使用微控制器.

也许我错过了完全明显的,但我无法想出一个漂亮而干净的宏来为我做转换.原则上我需要一种方法在编译期间转换13为其十六进制表示(2位数,没有通常在前面的0x)0d.

你会建议什么?

c macros hex decimal

5
推荐指数
1
解决办法
4170
查看次数

C++ 令人困惑的宏

我正在查看一些 windows directx 应用程序代码,看到他们使用宏 _T(x) 来设置他们的窗口名称,在查看宏定义时我看到了这个

#define _T(x)       __T(x)
Run Code Online (Sandbox Code Playgroud)

然后我跟着看了看__T

#define __T(x)      x
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

c++

4
推荐指数
1
解决办法
92
查看次数

从编译器选项打印变量

我正在尝试编译一个非常简单的 C 程序:

# program test.c
#include <stdio.h>

int main() 
{
    printf("HELLO WORLD \"%s\"\n\n", FOO);
}
Run Code Online (Sandbox Code Playgroud)

并编译为

gcc -o prog -D FOO=bar test.c
Run Code Online (Sandbox Code Playgroud)

基本上我希望有以下输出:

HELLO WORLD "bar"
Run Code Online (Sandbox Code Playgroud)

当我尝试编译上述内容时,出现错误

<command line>:1:13: note: expanded from here
#define FOO bar
Run Code Online (Sandbox Code Playgroud)

我什至要做以下事情(是的,我知道这不好):

#indef FOO
    define ZZZ sprintf("%s", FOO)
#endif 
Run Code Online (Sandbox Code Playgroud)

c

3
推荐指数
1
解决办法
80
查看次数

引用一个C++ MACRO参数

我有以下模板:

variable = config["variable"] ? config["variable"].as<type>() : default;
Run Code Online (Sandbox Code Playgroud)

我想创建一个宏来更快地完成这项工作,因为写这么多次变得很无聊.我会尝试类似的东西:

#define CONFIG_PARAM(config, key, type, alt) config["key"] ? config["key"].as<type> : alt;

title = CONFIG_PARAM(root, "title", std::string, "")
Run Code Online (Sandbox Code Playgroud)

很明显,那是行不通的.我怎么能这样做?

c++ macros

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

使用C预处理器为scanf构造字符串文字?

我正在尝试创建一个sscanf字符串文字,以帮助在C99中防止缓冲区溢出.目标是这样的:

#define MAX_ARG_LEN   16

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"(MAX_ARG_LEN-1)"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)

显而易见的"手动"解决方案如下:

#define MAX_ARG_LEN   16
#define MAX_ARG_CHARS "15"

char arg[MAX_ARG_LEN] = "";

if (sscanf(arg, "%"MAX_ARG_CHARS"X", &input) > 0)
Run Code Online (Sandbox Code Playgroud)

但是,我希望在缓冲区大小为16的情况下自动生成"%15X".这个链接几乎适用于我的应用程序:将预处理程序标记转换为字符串,但它不处理-1.

建议?

c string concatenation scanf c-preprocessor

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

C预处理器在字符串文字中插入/追加标记

我有以下宏:

#define ASSERT_ITERATOR_VALUE_TYPE(Iterator__, Value_type__)                      \
static_assert(std::is_same<Value_type__, typename Iterator__::value_type>::value, \
              "Expected iterator with value type #Value_type__")
Run Code Online (Sandbox Code Playgroud)

在上面的宏中,我试图Value_type__在作为第二个输入参数的字符串文字中插入/附加标记static_assert.

显然,这不是我想要实现的,因为如果我将宏声明为:

ASSERT_ITERATOR_VALUE_TYPE(std::set<int>::iterator, double);
Run Code Online (Sandbox Code Playgroud)

我会收到消息:

error: static assertion failed: Expected iterator with value type #Value_type__
                                                                  ^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

相反,我想接受这个消息:

error: static assertion failed: Expected iterator with value type double
                                                                  ^^^^^^
Run Code Online (Sandbox Code Playgroud)

现场演示

Q

是否有某种预处理器巫术可以帮助我达到我想要的目标?

c++ c-preprocessor c++11

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

在另一个宏中使用字符串宏

如何在C中的字符串宏中使用另一个宏?

我有这个:

#define MAX_OPERATION_COUNT 10
#define MSG_TOO_MANY_OPERATIONS "Too many operations! Only the first 10 were applied."
Run Code Online (Sandbox Code Playgroud)

但我希望第二个宏使用第一个宏的值.例如,在Java中,我会有类似的东西:

public static final int MAX_OPERATION_COUNT = 10;
public static final String MSG_TOO_MANY_OPERATIONS = "Too many operations! Only the first " + MAX_OPERATION_COUNT + " were applied.";
Run Code Online (Sandbox Code Playgroud)

有没有办法在C中做类似的事情?

编辑:这个问题 的解决方案与这个问题的解决方案非常相似,但我认为问题本身是完全不同的,应该单独处理.

c string macros

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

如何将 #define 的精确文字存储在字符串中以进行打印

#define图书馆深处有一个宏,我想快速知道它的确切值。有没有办法将定义的值存储到字符串中以便我可以打印它?

#define intgr 12
#define bnry 0b00000001
#define hex 0x0A
#define str "Hello World"

String myStr;

myStr = intgr;
cout<< myStr << endl;  //Simple enough, work no problem
//12              <- actual
//12              <- expected

myStr = bnry; // using "bnry" would not work as #define does not touch inside quotes
cout<< myStr << endl;
//1               <- actual
//0b00000001      <- expected

myStr = hex;
cout<< myStr << endl;
//10               <- actual
//0x0A             <- expected

myStr = str;
cout<< myStr << …
Run Code Online (Sandbox Code Playgroud)

c-preprocessor

0
推荐指数
1
解决办法
103
查看次数