头文件中的共享C常量

42

我想在多个C文件中共享某些C字符串常量。这些常量为了易读性跨越了多行:

const char *QUERY = "SELECT a,b,c "
                    "FROM table...";

执行上述操作会导致QUERY的重新定义错误。我不想使用宏,因为需要在每行后面添加反斜杠“\”。我可以将这些内容定义在单独的c文件中,并在h文件中extern变量,但我感到懒得这样做。

在C语言中有其他方法可以实现这一点吗?


头文件就像Armen所说的那样——请查看他的答案。 - Sadique
请注意,在C++中,全局const隐含地意味着static。https://dev59.com/bmct5IYBdhLWcg3wgNnR#53541011 - Ciro Santilli OurBigBook.com
4个回答

47

在某个 .c 文件中,编写你所写的内容。 在相应的 .h 文件中,编写。

extern const char* QUERY; //just declaration

在需要使用常量的地方包含.h文件。

没有其他好方法:)


:( 我就知道。我想我需要停止懒惰! - Manish
@Manish:这比在每个.c文件中编写声明要好。而且你知道 Ctrl+C -- Ctrl+V 也可以工作。 - Sadique
+1 只要是黑色,你可以选择任何颜色,哈哈 - pmg
3
@Acme:Ctrl+C -- Ctrl+V 正是我想要避免的。我知道如果我只在一个C文件中更改它,那么我会忘记在其他文件中进行修改,这将导致调试方面的噩梦。 - Manish
有人知道是否有工具可以生成头文件吗? - dykeag

18

您可以使用静态常量,实现您的目的。

myext.h:

#ifndef _MYEXT_H
#define _MYEXT_H
static const int myx = 245;
static const unsigned long int myy = 45678;
static const double myz = 3.14;
#endif

myfunc.h:

#ifndef MYFUNC_H
#define MYFUNC_H
void myfunc(void);
#endif

myfunc.c:

#include "myext.h"
#include "myfunc.h"
#include <stdio.h>

void myfunc(void)
{
    printf("%d\t%lu\t%f\n", myx, myy, myz);
}

myext.c:

#include "myext.h"
#include "myfunc.h"
#include <stdio.h>

int main()
{
    printf("%d\t%lu\t%f\n", myx, myy, myz);
    myfunc();
    return 0;
}

1
这种方法有一个缺点。如果常量在编译单元中没有被使用,一些编译器会抛出警告,而且无法通过其他方式消除这个警告,只能使用特定于编译器的方法来解决。 - Sander Mertens

3
你可以简单地使用#define将它们分开。
#define QUERY1 "SELECT a,b,c "
#define QUERY2 "FROM table..."

然后将它们合并为一个定义

#define QUERY QUERY1 QUERY2

1
这很有创意 :) 但它看起来很丑。 - Manish
3
丑陋和“回退键''”总是紧密联系的。 - pmg

1

有几种方法

  • 将变量放在一个文件中,在头文件中声明为extern,并在需要的地方包含该头文件
  • 考虑使用一些外部工具,在宏定义末尾添加'\'
  • 克服你的懒惰,在所有文件中将变量声明为extern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接